* dwarf2loc.c (find_location_expression): Retrieve beginning and
authorUlrich Weigand <uweigand@de.ibm.com>
Mon, 20 Jul 2009 15:06:13 +0000 (15:06 +0000)
committerUlrich Weigand <uweigand@de.ibm.com>
Mon, 20 Jul 2009 15:06:13 +0000 (15:06 +0000)
ending address offsets in location list entries as integers,
not as addresses.

gdb/ChangeLog
gdb/dwarf2loc.c

index 9b8e9f9becde56d95cb85a23350f82728389584a..f07defa380e65f28e7f0179b9d683909dd7e6bff 100644 (file)
@@ -1,3 +1,9 @@
+2009-07-20  Ulrich Weigand  <uweigand@de.ibm.com>
+
+       * dwarf2loc.c (find_location_expression): Retrieve beginning and
+       ending address offsets in location list entries as integers,
+       not as addresses.
+
 2009-07-20  Ulrich Weigand  <uweigand@de.ibm.com>
 
        * infrun.c (wait_for_inferior): Invalidate registers and overlay
index b16323153e3b77f5aef17202128766d1f6c6ca93..071b5ac14a6525a0f14b89246a381175793b24ad 100644 (file)
@@ -70,22 +70,28 @@ find_location_expression (struct dwarf2_loclist_baton *baton,
 
   while (1)
     {
-      low = dwarf2_read_address (gdbarch, loc_ptr, buf_end, addr_size);
-      loc_ptr += addr_size;
-      high = dwarf2_read_address (gdbarch, loc_ptr, buf_end, addr_size);
-      loc_ptr += addr_size;
+      if (buf_end - loc_ptr < 2 * addr_size)
+       error (_("find_location_expression: Corrupted DWARF expression."));
 
-      /* An end-of-list entry.  */
-      if (low == 0 && high == 0)
-       return NULL;
+      low = extract_unsigned_integer (loc_ptr, addr_size, byte_order);
+      loc_ptr += addr_size;
 
       /* A base-address-selection entry.  */
-      if ((low & base_mask) == base_mask)
+      if (low == base_mask)
        {
-         base_address = high;
+         base_address = dwarf2_read_address (gdbarch,
+                                             loc_ptr, buf_end, addr_size);
+         loc_ptr += addr_size;
          continue;
        }
 
+      high = extract_unsigned_integer (loc_ptr, addr_size, byte_order);
+      loc_ptr += addr_size;
+
+      /* An end-of-list entry.  */
+      if (low == 0 && high == 0)
+       return NULL;
+
       /* Otherwise, a location expression entry.  */
       low += base_address;
       high += base_address;