diff options
author | Alan Modra <amodra@gmail.com> | 2019-12-18 15:37:44 +1030 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2019-12-18 18:38:13 +1030 |
commit | 2480b6fa946bb2d2dc993b1c4a83a8e1258a75e8 (patch) | |
tree | ce542aad0a4875a62960e77e23c4729b92d87da4 /opcodes/vax-dis.c | |
parent | 4a422785822ec9302f681c8fbc6ba2cc35231b09 (diff) | |
download | fsf-binutils-gdb-2480b6fa946bb2d2dc993b1c4a83a8e1258a75e8.zip fsf-binutils-gdb-2480b6fa946bb2d2dc993b1c4a83a8e1258a75e8.tar.gz fsf-binutils-gdb-2480b6fa946bb2d2dc993b1c4a83a8e1258a75e8.tar.bz2 |
More signed overflow fixes
The arc fix in create_map avoiding signed overflow by casting an
unsigned char to unsigned int before shifting, shows one of the
dangers of blinding doing that. The problem in this case was that the
variable storing the value, newAuxRegister->address, was a long.
Using the unsigned cast meant that the 32-bit value was zero extended
when long is 64 bits. Previously we had a sign extension. Net result
was that comparisons in arcExtMap_auxRegName didn't match. Of course,
I could have cast the 32-bit unsigned value back to signed before
storing in a long, but it's neater to just use an unsigned int for the
address.
opcodes/
* alpha-opc.c (OP): Avoid signed overflow.
* arm-dis.c (print_insn): Likewise.
* mcore-dis.c (print_insn_mcore): Likewise.
* pj-dis.c (get_int): Likewise.
* ppc-opc.c (EBD15, EBD15BI): Likewise.
* score7-dis.c (s7_print_insn): Likewise.
* tic30-dis.c (print_insn_tic30): Likewise.
* v850-opc.c (insert_SELID): Likewise.
* vax-dis.c (print_insn_vax): Likewise.
* arc-ext.c (create_map): Likewise.
(struct ExtAuxRegister): Make "address" field unsigned int.
(arcExtMap_auxRegName): Pass unsigned address.
(dump_ARC_extmap): Adjust.
* arc-ext.h (arcExtMap_auxRegName): Update prototype.
Diffstat (limited to 'opcodes/vax-dis.c')
-rw-r--r-- | opcodes/vax-dis.c | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/opcodes/vax-dis.c b/opcodes/vax-dis.c index 3bdfa15..0b33141 100644 --- a/opcodes/vax-dis.c +++ b/opcodes/vax-dis.c @@ -440,7 +440,8 @@ print_insn_vax (bfd_vma memaddr, disassemble_info *info) int offset; FETCH_DATA (info, buffer + 4); - offset = buffer[3] << 24 | buffer[2] << 16 | buffer[1] << 8 | buffer[0]; + offset = ((unsigned) buffer[3] << 24 | buffer[2] << 16 + | buffer[1] << 8 | buffer[0]); (*info->fprintf_func) (info->stream, ".long 0x%08x", offset); return 4; |