2008-09-19 Andrew Stubbs <ams@codesourcery.com>
authorAndrew Stubbs <andrew.stubbs@st.com>
Fri, 19 Sep 2008 18:12:17 +0000 (18:12 +0000)
committerAndrew Stubbs <andrew.stubbs@st.com>
Fri, 19 Sep 2008 18:12:17 +0000 (18:12 +0000)
* frame.c (get_frame_register_bytes): Detect bad debug info.

gdb/ChangeLog
gdb/frame.c

index 65f60a9aeec3642e47614847b23c232e483fb7bb..b88390d46ce70972bc2883d3746a04be49bd349c 100644 (file)
@@ -1,3 +1,7 @@
+2008-09-19  Andrew Stubbs  <ams@codesourcery.com>
+
+       * frame.c (get_frame_register_bytes): Detect bad debug info.
+
 2008-09-17  Jan Kratochvil  <jan.kratochvil@redhat.com>
 
        Fix a crash on uninitialized ECS->EVENT_THREAD for a newly found thread.
index 55ded7168250fb311114a0b32e9f312dddbdbc65..88d51f782d9ae08bfa892a179f060763841d584b 100644 (file)
@@ -796,6 +796,8 @@ get_frame_register_bytes (struct frame_info *frame, int regnum,
                          CORE_ADDR offset, int len, gdb_byte *myaddr)
 {
   struct gdbarch *gdbarch = get_frame_arch (frame);
+  int i;
+  int maxsize;
 
   /* Skip registers wholly inside of OFFSET.  */
   while (offset >= register_size (gdbarch, regnum))
@@ -804,6 +806,22 @@ get_frame_register_bytes (struct frame_info *frame, int regnum,
       regnum++;
     }
 
+  /* Detect bad debug info.  */
+  maxsize = -offset;
+  for (i = regnum; i < gdbarch_num_regs (gdbarch); i++)
+    {
+      int thissize = register_size (gdbarch, i);
+      if (thissize == 0)
+       break;
+      maxsize += thissize;
+    }
+  if (len > maxsize)
+    {
+      warning (_("Bad debug information detected: "
+                "Attempt to read %d bytes from registers."), len);
+      return 0;
+    }
+
   /* Copy the data.  */
   while (len > 0)
     {
This page took 0.030502 seconds and 4 git commands to generate.