From d93bba9e0d6c7bd3a570688612a3dd0a5eb0193a Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Tue, 10 Dec 2019 23:37:03 +1030 Subject: [PATCH] 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. --- opcodes/ChangeLog | 5 +++++ opcodes/csky-dis.c | 8 ++++---- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/opcodes/ChangeLog b/opcodes/ChangeLog index 6b76f158c95..5cd7361512b 100644 --- a/opcodes/ChangeLog +++ b/opcodes/ChangeLog @@ -1,3 +1,8 @@ +2019-12-11 Alan Modra + + * csky-dis.c (csky_chars_to_number): Rewrite. Avoid signed + overflow when collecting bytes of a number. + 2019-12-11 Alan Modra * cris-dis.c (print_with_operands): Avoid signed integer diff --git a/opcodes/csky-dis.c b/opcodes/csky-dis.c index ffdb5964958..af830f36519 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; } -- 2.30.2