aboutsummaryrefslogtreecommitdiff
path: root/opcodes/csky-dis.c
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2019-12-10 23:37:03 +1030
committerAlan Modra <amodra@gmail.com>2019-12-11 11:38:45 +1030
commitd93bba9e0d6c7bd3a570688612a3dd0a5eb0193a (patch)
treeec55590cd16f5df7b8ca806f773181ace2294e50 /opcodes/csky-dis.c
parentc202f69e5130fed314afa079ce30abaad4d34991 (diff)
downloadfsf-binutils-gdb-d93bba9e0d6c7bd3a570688612a3dd0a5eb0193a.zip
fsf-binutils-gdb-d93bba9e0d6c7bd3a570688612a3dd0a5eb0193a.tar.gz
fsf-binutils-gdb-d93bba9e0d6c7bd3a570688612a3dd0a5eb0193a.tar.bz2
ubsan: csky: left shift cannot be represented in type 'int'
In the following buf is an unsigned char array, so elements are promoted to int before arithmetic operations. if (dis_info.info->endian == BFD_ENDIAN_BIG) while (n--) val |= buf[n] << (n*8); else for (i = 0; i < n; i++) val |= buf[i] << (i*8); * csky-dis.c (csky_chars_to_number): Rewrite. Avoid signed overflow when collecting bytes of a number.
Diffstat (limited to 'opcodes/csky-dis.c')
-rw-r--r--opcodes/csky-dis.c8
1 files changed, 4 insertions, 4 deletions
diff --git a/opcodes/csky-dis.c b/opcodes/csky-dis.c
index ffdb596..af830f3 100644
--- a/opcodes/csky-dis.c
+++ b/opcodes/csky-dis.c
@@ -140,11 +140,11 @@ csky_chars_to_number (unsigned char * buf, int n)
unsigned int val = 0;
if (dis_info.info->endian == BFD_ENDIAN_BIG)
- while (n--)
- val |= buf[n] << (n*8);
- else
for (i = 0; i < n; i++)
- val |= buf[i] << (i*8);
+ val = val << 8 | (buf[i] & 0xff);
+ else
+ for (i = n - 1; i >= 0; i--)
+ val = val << 8 | (buf[i] & 0xff);
return val;
}