* dwarf.c (read_uleb128): Fix overflow test.
authorian <ian@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 3 Oct 2012 22:07:12 +0000 (22:07 +0000)
committerian <ian@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 3 Oct 2012 22:07:12 +0000 (22:07 +0000)
(read_sleb128): Likewise.
(build_address_map): Don't change unit_buf.start.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@192053 138bc75d-0d04-0410-961f-82ee72b054a4

libbacktrace/ChangeLog
libbacktrace/dwarf.c

index eca8014..88a7eb0 100644 (file)
@@ -1,3 +1,9 @@
+2012-10-03  Ian Lance Taylor  <iant@google.com>
+
+       * dwarf.c (read_uleb128): Fix overflow test.
+       (read_sleb128): Likewise.
+       (build_address_map): Don't change unit_buf.start.
+
 2012-10-02  Uros Bizjak  <ubizjak@gmail.com>
 
        PR other/54761
index 68ebb4e..25973cb 100644 (file)
@@ -524,10 +524,12 @@ read_uleb128 (struct dwarf_buf *buf)
 {
   uint64_t ret;
   unsigned int shift;
+  int overflow;
   unsigned char b;
 
   ret = 0;
   shift = 0;
+  overflow = 0;
   do
     {
       const unsigned char *p;
@@ -536,14 +538,17 @@ read_uleb128 (struct dwarf_buf *buf)
       if (!advance (buf, 1))
        return 0;
       b = *p;
-      ret |= ((uint64_t) (b & 0x7f)) << shift;
+      if (shift < 64)
+       ret |= ((uint64_t) (b & 0x7f)) << shift;
+      else if (!overflow)
+       {
+         dwarf_buf_error (buf, "LEB128 overflows uint64_t");
+         overflow = 1;
+       }
       shift += 7;
     }
   while ((b & 0x80) != 0);
 
-  if (shift > 64)
-    dwarf_buf_error (buf, "LEB128 overflows uint64_5");
-
   return ret;
 }
 
@@ -554,10 +559,12 @@ read_sleb128 (struct dwarf_buf *buf)
 {
   uint64_t val;
   unsigned int shift;
+  int overflow;
   unsigned char b;
 
   val = 0;
   shift = 0;
+  overflow = 0;
   do
     {
       const unsigned char *p;
@@ -566,15 +573,18 @@ read_sleb128 (struct dwarf_buf *buf)
       if (!advance (buf, 1))
        return 0;
       b = *p;
-      val |= ((uint64_t) (b & 0x7f)) << shift;
+      if (shift < 64)
+       val |= ((uint64_t) (b & 0x7f)) << shift;
+      else if (!overflow)
+       {
+         dwarf_buf_error (buf, "signed LEB128 overflows uint64_t");
+         overflow = 1;
+       }
       shift += 7;
     }
   while ((b & 0x80) != 0);
 
-  if (shift > 64)
-    dwarf_buf_error (buf, "signed LEB128 overflows uint64_t");
-
-  if ((b & 0x40) != 0)
+  if ((b & 0x40) != 0 && shift < 64)
     val |= ((uint64_t) -1) << shift;
 
   return (int64_t) val;
@@ -1262,7 +1272,6 @@ build_address_map (struct backtrace_state *state,
        }
 
       unit_buf = info;
-      unit_buf.start = info.buf;
       unit_buf.left = len;
 
       if (!advance (&info, len))