Fix a bogus error message from the DWARF LEB129 decoder when trying to read a signed...
authorNick Clifton <nickc@redhat.com>
Fri, 28 Aug 2020 15:04:49 +0000 (16:04 +0100)
committerNick Clifton <nickc@redhat.com>
Fri, 28 Aug 2020 15:04:49 +0000 (16:04 +0100)
PR 26548
* dwarf.c (read_leb128): When checking for overflow of a signed
read, use a signed shift.

binutils/ChangeLog
binutils/dwarf.c

index 8a6cadcc1c0975527105e1a4b5db969ab21d5a46..ca9028688f9e017e79d389644845fe53cb8b1748 100644 (file)
@@ -1,3 +1,9 @@
+2020-08-28  Nick Clifton  <nickc@redhat.com>
+
+       PR 26548
+       * dwarf.c (read_leb128): When checking for overflow of a signed
+       read, use a signed shift.
+
 2020-08-28  Cooper Qu  <cooper.qu@linux.alibaba.com>
 
        * readelf.c (get_csky_section_type_name): New.
index 5275994871849f5ab00de7ae6f8ea52dba5e1bba..616e53484908ae38e5f19bd884952f373014c946 100644 (file)
@@ -345,20 +345,34 @@ read_leb128 (unsigned char *data,
   while (data < end)
     {
       unsigned char byte = *data++;
+      bfd_boolean cont = (byte & 0x80) ? TRUE : FALSE;
+
+      byte &= 0x7f;
       num_read++;
 
       if (shift < sizeof (result) * 8)
        {
-         result |= ((dwarf_vma) (byte & 0x7f)) << shift;
-         if ((result >> shift) != (byte & 0x7f))
-           /* Overflow.  */
-           status |= 2;
+         result |= ((dwarf_vma) byte) << shift;
+         if (sign)
+           {
+             if ((((dwarf_signed_vma) result >> shift) & 0x7f) != byte)
+               /* Overflow.  */
+               status |= 2;
+           }
+         else if ((result >> shift) != byte)
+           {
+             /* Overflow.  */
+             status |= 2;
+           }
+
          shift += 7;
        }
-      else if ((byte & 0x7f) != 0)
-       status |= 2;
+      else if (byte != 0)
+       {
+         status |= 2;
+       }
 
-      if ((byte & 0x80) == 0)
+      if (!cont)
        {
          status &= ~1;
          if (sign && (shift < 8 * sizeof (result)) && (byte & 0x40))