PR26476, PR26477 UBSAN: elfxx-mips.c:2695,5370 cannot be represented
authorAlan Modra <amodra@gmail.com>
Mon, 31 Aug 2020 02:08:05 +0000 (11:38 +0930)
committerAlan Modra <amodra@gmail.com>
Mon, 31 Aug 2020 10:58:10 +0000 (20:28 +0930)
PR 26476
PR 26477
* elfxx-mips.c (CRINFO_CTYPE, CRINFO_RTYPE, CRINFO_DIST2TO),
(CRINFO_RELVADDR): Make unsigned.
(mips_elf_nullify_got_load): Use unsigned constant when shifting
into sign bit.

bfd/ChangeLog
bfd/elfxx-mips.c

index f972a5adb4ffb2ed02b1660906adeef9ae54f013..ae405e893257b900197184c0ef6303fa45ee91bf 100644 (file)
@@ -1,3 +1,12 @@
+2020-08-31  Alan Modra  <amodra@gmail.com>
+
+       PR 26476
+       PR 26477
+       * elfxx-mips.c (CRINFO_CTYPE, CRINFO_RTYPE, CRINFO_DIST2TO),
+       (CRINFO_RELVADDR): Make unsigned.
+       (mips_elf_nullify_got_load): Use unsigned constant when shifting
+       into sign bit.
+
 2020-08-31  Alan Modra  <amodra@gmail.com>
 
        PR 26466
index bc0843508e0040796c9007be0bc2634de615a528..c0970fb85d04643ecf3dfbeea0ae6e6eec64230a 100644 (file)
@@ -698,13 +698,13 @@ typedef struct
 
 /* These are the constants used to swap the bitfields in a crinfo.  */
 
-#define CRINFO_CTYPE (0x1)
+#define CRINFO_CTYPE (0x1U)
 #define CRINFO_CTYPE_SH (31)
-#define CRINFO_RTYPE (0xf)
+#define CRINFO_RTYPE (0xfU)
 #define CRINFO_RTYPE_SH (27)
-#define CRINFO_DIST2TO (0xff)
+#define CRINFO_DIST2TO (0xffU)
 #define CRINFO_DIST2TO_SH (19)
-#define CRINFO_RELVADDR (0x7ffff)
+#define CRINFO_RELVADDR (0x7ffffU)
 #define CRINFO_RELVADDR_SH (0)
 
 /* A compact relocation info has long (3 words) or short (2 words)
@@ -5367,7 +5367,7 @@ mips_elf_nullify_got_load (bfd *input_bfd, bfd_byte *contents,
   if (mips16_reloc_p (r_type)
       && (((x >> 22) & 0x3ff) == 0x3d3                         /* LW */
          || ((x >> 22) & 0x3ff) == 0x3c7))                     /* LD */
-    x = (0x3cd << 22) | (x & (7 << 16)) << 3;                  /* LI */
+    x = (0x3cdU << 22) | (x & (7 << 16)) << 3;                 /* LI */
   else if (micromips_reloc_p (r_type)
           && ((x >> 26) & 0x37) == 0x37)                       /* LW/LD */
     x = (0xc << 26) | (x & (0x1f << 21));                      /* ADDIU */