[binutils-gdb] ubsan: tic6x: shift left of int

Alan Modra amodra@sourceware.org
Wed Dec 11 01:14:00 GMT 2019


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=b84f6152ee8bb141acae181b34a51c3e58da8930

commit b84f6152ee8bb141acae181b34a51c3e58da8930
Author: Alan Modra <amodra@gmail.com>
Date:   Wed Dec 11 08:52:22 2019 +1030

    ubsan: tic6x: shift left of int
    
    	* tic6x-dis.c (tic6x_extract_32): Avoid signed overflow.

Diff:
---
 opcodes/ChangeLog   | 4 ++++
 opcodes/tic6x-dis.c | 4 ++--
 2 files changed, 6 insertions(+), 2 deletions(-)

diff --git a/opcodes/ChangeLog b/opcodes/ChangeLog
index 3ae93c1..3ba885c 100644
--- a/opcodes/ChangeLog
+++ b/opcodes/ChangeLog
@@ -1,5 +1,9 @@
 2019-12-11  Alan Modra  <amodra@gmail.com>
 
+	* tic6x-dis.c (tic6x_extract_32): Avoid signed overflow.
+
+2019-12-11  Alan Modra  <amodra@gmail.com>
+
 	* tic4x-dis.c (tic4x_print_register): Formatting.  Don't segfault
 	on NULL registertable entry.
 	(tic4x_hash_opcode): Use unsigned arithmetic.
diff --git a/opcodes/tic6x-dis.c b/opcodes/tic6x-dis.c
index 36075da..45a1e98 100644
--- a/opcodes/tic6x-dis.c
+++ b/opcodes/tic6x-dis.c
@@ -163,9 +163,9 @@ static unsigned int
 tic6x_extract_32 (unsigned char *p, struct disassemble_info *info)
 {
   if (info->endian == BFD_ENDIAN_LITTLE)
-    return (p[0]) | (p[1] << 8) | (p[2] << 16) | (p[3] << 24);
+    return p[0] | (p[1] << 8) | (p[2] << 16) | ((unsigned) p[3] << 24);
   else
-    return (p[3]) | (p[2] << 8) | (p[1] << 16) | (p[0] << 24);
+    return p[3] | (p[2] << 8) | (p[1] << 16) | ((unsigned) p[0] << 24);
 }
 
 /* Extract a 16-bit value read from the instruction stream.  */



More information about the Binutils-cvs mailing list