aboutsummaryrefslogtreecommitdiff
path: root/disas
diff options
context:
space:
mode:
authorPeter Maydell <peter.maydell@linaro.org>2017-03-03 15:50:30 +0000
committerPeter Maydell <peter.maydell@linaro.org>2017-03-07 14:33:51 +0000
commit2e3883d03df167b15f2acc5345eb9a7e0150a062 (patch)
treef279b7f0eb1cea99b6a654100511b70c5938d974 /disas
parent3f168b5d353fa68baab55ea0c6ba791f0df027dc (diff)
disas/m68k: Avoid unintended sign extension in get_field()
In get_field(), we take an 'unsigned char' value and shift it left, which implicitly promotes it to 'signed int', before ORing it into an 'unsigned long' type. If 'unsigned long' is 64 bits then this will result in a sign extension and the top 32 bits of the result will be 1s. Add explicit casts to unsigned long before shifting to prevent this. (Spotted by Coverity, CID 715697.) Signed-off-by: Peter Maydell <peter.maydell@linaro.org> Reviewed-by: Laurent Vivier <laurent@vivier.eu> Message-id: 1488556233-31246-4-git-send-email-peter.maydell@linaro.org
Diffstat (limited to 'disas')
-rw-r--r--disas/m68k.c5
1 files changed, 3 insertions, 2 deletions
diff --git a/disas/m68k.c b/disas/m68k.c
index 073abb9efd..61b689ef3e 100644
--- a/disas/m68k.c
+++ b/disas/m68k.c
@@ -4685,10 +4685,11 @@ get_field (const unsigned char *data, enum floatformat_byteorders order,
/* This is the last byte; zero out the bits which are not part of
this field. */
result |=
- (*(data + cur_byte) & ((1 << (len - cur_bitshift)) - 1))
+ (unsigned long)(*(data + cur_byte)
+ & ((1 << (len - cur_bitshift)) - 1))
<< cur_bitshift;
else
- result |= *(data + cur_byte) << cur_bitshift;
+ result |= (unsigned long)*(data + cur_byte) << cur_bitshift;
cur_bitshift += FLOATFORMAT_CHAR_BIT;
if (order == floatformat_little)
++cur_byte;