diff options
author | Alan Modra <amodra@gmail.com> | 2019-12-16 10:31:34 +1030 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2019-12-16 17:33:53 +1030 |
commit | cedfc77485dbb566619dc1e2d729ce0a70d1a4ad (patch) | |
tree | 1831ca7e415295691de2a88b77c25a09e8f0cc85 /opcodes/bfin-dis.c | |
parent | 4bdb25fe6902963ca9cf91d6b2688cf888527bf8 (diff) | |
download | binutils-cedfc77485dbb566619dc1e2d729ce0a70d1a4ad.zip binutils-cedfc77485dbb566619dc1e2d729ce0a70d1a4ad.tar.gz binutils-cedfc77485dbb566619dc1e2d729ce0a70d1a4ad.tar.bz2 |
ubsan: bfin: left shift of negative value
* bfin-dis.c (fmtconst, fmtconst_val): Avoid signed overflow.
Diffstat (limited to 'opcodes/bfin-dis.c')
-rw-r--r-- | opcodes/bfin-dis.c | 17 |
1 files changed, 8 insertions, 9 deletions
diff --git a/opcodes/bfin-dis.c b/opcodes/bfin-dis.c index 711f7e1..19ce426 100644 --- a/opcodes/bfin-dis.c +++ b/opcodes/bfin-dis.c @@ -128,7 +128,8 @@ fmtconst (const_forms_t cf, TIword x, bfd_vma pc, disassemble_info *outf) if (constant_formats[cf].pcrel) x = SIGNEXTEND (x, constant_formats[cf].nbits); - ea = (x + constant_formats[cf].offset) << constant_formats[cf].scale; + ea = x + constant_formats[cf].offset; + ea = ea << constant_formats[cf].scale; if (constant_formats[cf].pcrel) ea += pc; @@ -152,17 +153,14 @@ fmtconst (const_forms_t cf, TIword x, bfd_vma pc, disassemble_info *outf) { int nb = constant_formats[cf].nbits + 1; - x = x | (1 << constant_formats[cf].nbits); + x = x | (1ul << constant_formats[cf].nbits); x = SIGNEXTEND (x, nb); } else if (constant_formats[cf].issigned) x = SIGNEXTEND (x, constant_formats[cf].nbits); - if (constant_formats[cf].offset) - x += constant_formats[cf].offset; - - if (constant_formats[cf].scale) - x <<= constant_formats[cf].scale; + x += constant_formats[cf].offset; + x = (unsigned long) x << constant_formats[cf].scale; if (constant_formats[cf].decimal) sprintf (buf, "%*li", constant_formats[cf].leading, x); @@ -186,7 +184,8 @@ fmtconst_val (const_forms_t cf, unsigned int x, unsigned int pc) if (constant_formats[cf].pcrel) x = SIGNEXTEND (x, constant_formats[cf].nbits); - ea = (x + constant_formats[cf].offset) << constant_formats[cf].scale; + ea = x + constant_formats[cf].offset; + ea = ea << constant_formats[cf].scale; if (constant_formats[cf].pcrel) ea += pc; @@ -197,7 +196,7 @@ fmtconst_val (const_forms_t cf, unsigned int x, unsigned int pc) if (constant_formats[cf].negative) { int nb = constant_formats[cf].nbits + 1; - x = x | (1u << constant_formats[cf].nbits); + x = x | (1ul << constant_formats[cf].nbits); x = SIGNEXTEND (x, nb); } else if (constant_formats[cf].issigned) |