Prevent illegal memory accesses triggerd by intger overflow when parsing corrupt...
authorNick Clifton <nickc@redhat.com>
Thu, 1 Mar 2018 16:14:08 +0000 (16:14 +0000)
committerNick Clifton <nickc@redhat.com>
Thu, 1 Mar 2018 16:14:08 +0000 (16:14 +0000)
PR 22905
* dwarf.c (display_debug_ranges): Check that the offset loaded
from the range_entry structure is valid.

binutils/ChangeLog
binutils/dwarf.c

index d9db858fc45cc65f01c1edb4e833bc1688d1cc61..067dd95e1e411bb354cd9ce2646d94732087c572 100644 (file)
@@ -1,3 +1,9 @@
+2018-03-01  Nick Clifton  <nickc@redhat.com>
+
+       PR 22905
+       * dwarf.c (display_debug_ranges): Check that the offset loaded
+       from the range_entry structure is valid.
+
 2018-03-01  Alan Modra  <amodra@gmail.com>
 
        * configure.ac (ALL_LINGUAS): Add sr.  Sort.
index 6aca9b79942b5593b6ab445795d5b50b8f973bed..17896e61107eb53afac4b47820d2b18cf2398a9d 100644 (file)
@@ -387,6 +387,9 @@ read_uleb128 (unsigned char * data,
     }                                                          \
   while (0)
 
+/* Read AMOUNT bytes from PTR and store them in VAL as an unsigned value.
+   Checks to make sure that the read will not reach or pass END
+   and that VAL is big enough to hold AMOUNT bytes.  */
 #define SAFE_BYTE_GET(VAL, PTR, AMOUNT, END)   \
   do                                           \
     {                                          \
@@ -415,6 +418,7 @@ read_uleb128 (unsigned char * data,
     }                                          \
   while (0)
 
+/* Like SAFE_BYTE_GET, but also increments PTR by AMOUNT.  */
 #define SAFE_BYTE_GET_AND_INC(VAL, PTR, AMOUNT, END)   \
   do                                                   \
     {                                                  \
@@ -423,6 +427,7 @@ read_uleb128 (unsigned char * data,
     }                                                  \
   while (0)
 
+/* Like SAFE_BYTE_GET, but reads a signed value.  */
 #define SAFE_SIGNED_BYTE_GET(VAL, PTR, AMOUNT, END)    \
   do                                                   \
     {                                                  \
@@ -441,6 +446,7 @@ read_uleb128 (unsigned char * data,
     }                                                  \
   while (0)
 
+/* Like SAFE_SIGNED_BYTE_GET, but also increments PTR by AMOUNT.  */
 #define SAFE_SIGNED_BYTE_GET_AND_INC(VAL, PTR, AMOUNT, END)    \
   do                                                           \
     {                                                          \
@@ -6543,6 +6549,7 @@ display_debug_ranges_list (unsigned char *start, unsigned char *finish,
        break;
       SAFE_SIGNED_BYTE_GET_AND_INC (end, start, pointer_size, finish);
 
+      
       printf ("    %8.8lx ", offset);
 
       if (begin == 0 && end == 0)
@@ -6810,6 +6817,13 @@ display_debug_ranges (struct dwarf_section *section,
          continue;
        }
 
+      if (next < section_begin || next >= finish)
+       {
+         warn (_("Corrupt offset (%#8.8lx) in range entry %u\n"),
+               (unsigned long) offset, i);
+         continue;
+       }
+
       if (dwarf_check != 0 && i > 0)
        {
          if (start < next)
@@ -6825,6 +6839,7 @@ display_debug_ranges (struct dwarf_section *section,
                    (unsigned long) (next - section_begin), section->name);
            }
        }
+
       start = next;
       last_start = next;