PR26442 UBSAN: elf32-crx.c:512 cannot be represented in int
authorAlan Modra <amodra@gmail.com>
Sun, 30 Aug 2020 23:02:32 +0000 (08:32 +0930)
committerAlan Modra <amodra@gmail.com>
Mon, 31 Aug 2020 10:58:09 +0000 (20:28 +0930)
PR 26442
* elf32-crx.c (crx_elf_final_link_relocate): Calculate reloc_bits
without undefined behaviour.  Tidy excess casts.

bfd/ChangeLog
bfd/elf32-crx.c

index 5d004cd7df03a67f2f367835d882f1c82e654c12..7388c4d97ce48fb4c4a13b1c0bdc5601cb2165ff 100644 (file)
@@ -1,3 +1,9 @@
+2020-08-31  Alan Modra  <amodra@gmail.com>
+
+       PR 26442
+       * elf32-crx.c (crx_elf_final_link_relocate): Calculate reloc_bits
+       without undefined behaviour.  Tidy excess casts.
+
 2020-08-31  Alan Modra  <amodra@gmail.com>
 
        * elf-m10300.c (mn10300_elf_relax_delete_bytes): Calculate
index 82f1a3e469033206e943c832bc441ef70b47c81b..32db5b7fff2b8f6a869ec28d5715c29e466781ce 100644 (file)
@@ -506,25 +506,18 @@ crx_elf_final_link_relocate (reloc_howto_type *howto, bfd *input_bfd,
      as signed or unsigned.  */
   check = Rvalue >> howto->rightshift;
 
-  /* Assumes two's complement.  This expression avoids
-     overflow if howto->bitsize is the number of bits in
-     bfd_vma.  */
-  reloc_bits = (((1 << (howto->bitsize - 1)) - 1) << 1) | 1;
-
-  if (((bfd_vma) check & ~reloc_bits) != 0
-      && (((bfd_vma) check & ~reloc_bits)
-         != (-(bfd_vma) 1 & ~reloc_bits)))
+  reloc_bits = ((bfd_vma) 1 << (howto->bitsize - 1) << 1) - 1;
+
+  if ((check & ~reloc_bits) != 0
+      && (check & ~reloc_bits) != ((bfd_vma) -1 & ~reloc_bits))
     {
       /* The above right shift is incorrect for a signed
         value.  See if turning on the upper bits fixes the
         overflow.  */
       if (howto->rightshift && (bfd_signed_vma) Rvalue < 0)
        {
-         check |= ((bfd_vma) - 1
-                   & ~((bfd_vma) - 1
-                       >> howto->rightshift));
-         if (((bfd_vma) check & ~reloc_bits)
-             != (-(bfd_vma) 1 & ~reloc_bits))
+         check |= (bfd_vma) -1 & ~((bfd_vma) -1 >> howto->rightshift);
+         if ((check & ~reloc_bits) != ((bfd_vma) -1 & ~reloc_bits))
            return bfd_reloc_overflow;
        }
       else
@@ -532,7 +525,7 @@ crx_elf_final_link_relocate (reloc_howto_type *howto, bfd *input_bfd,
     }
 
   /* Drop unwanted bits from the value we are relocating to.  */
-  Rvalue >>= (bfd_vma) howto->rightshift;
+  Rvalue >>= howto->rightshift;
 
   /* Apply dst_mask to select only relocatable part of the insn.  */
   Rvalue &= howto->dst_mask;