]> git.ipfire.org Git - thirdparty/elfutils.git/commitdiff
Use the new reader hooks in several places
authorPetr Machata <pmachata@redhat.com>
Thu, 23 Apr 2009 15:44:48 +0000 (17:44 +0200)
committerPetr Machata <pmachata@redhat.com>
Thu, 23 Apr 2009 15:44:48 +0000 (17:44 +0200)
libdw/ChangeLog
libdw/dwarf_formaddr.c
libdw/dwarf_formref_die.c
libdw/dwarf_getlocation.c
libdw/dwarf_getpubnames.c

index 953d2c27785754d10da9a227b74c5373d6b0e3a4..55c87014df4d2b7281d3d9d7b989fff6c03e19b7 100644 (file)
@@ -1,3 +1,11 @@
+2009-04-23  Petr Machata  <pmachata@redhat.com>
+
+       * dwarf_formaddr.c (dwarf_formaddr): Call __libdw_read_* instead
+       of read_*ubyte_unaligned.
+       * dwarf_formref_die.c (dwarf_formref_die): Likewise.
+       * dwarf_getlocation.c (dwarf_getlocation_addr): Likewise.
+       * dwarf_getpubnames.c (get_offsets, dwarf_getpubnames): Likewise.
+
 2009-04-23  Petr Machata  <pmachata@redhat.com>
 
        * libdwP.h (__libdw_read_addr_inc, __libdw_read_off_inc,
index dcb58d43348c79babc83b044754f9dcbe449594d..aff549155b006aa9cd70c9ba3de37090a370654b 100644 (file)
@@ -70,10 +70,9 @@ dwarf_formaddr (attr, return_addr)
       return -1;
     }
 
-  if (attr->cu->address_size == 8)
-    *return_addr = read_8ubyte_unaligned (attr->cu->dbg, attr->valp);
-  else
-    *return_addr = read_4ubyte_unaligned (attr->cu->dbg, attr->valp);
+  if (__libdw_read_addr (attr->cu->dbg, return_addr, attr->valp,
+                        attr->cu->address_size == 8))
+    return -1l;
 
   return 0;
 }
index 90a4b2d358d5301fc4ca7232ed34898c841b148e..3bd89fc1396f4f80836c83c0f3f94eaa599a2887 100644 (file)
@@ -72,10 +72,9 @@ dwarf_formref_die (attr, die_mem)
                          ? attr->cu->address_size
                          : attr->cu->offset_size);
 
-      if (ref_size == 8)
-       offset = read_8ubyte_unaligned (attr->cu->dbg, attr->valp);
-      else
-       offset = read_4ubyte_unaligned (attr->cu->dbg, attr->valp);
+      if (__libdw_read_addr (attr->cu->dbg, &offset,
+                            attr->valp, ref_size == 8))
+       return NULL;
     }
   else
     {
index f680aa9692e3673c66935c763be0f9186834d226..5df8cc6f1501b1b66b0ed96570e24ef63cf3b2e4 100644 (file)
@@ -415,29 +415,19 @@ dwarf_getlocation_addr (attr, address, llbufs, listlens, maxlocs)
 
       Dwarf_Addr begin;
       Dwarf_Addr end;
-      if (attr->cu->address_size == 8)
-       {
-         begin = read_8ubyte_unaligned_inc (attr->cu->dbg, readp);
-         end = read_8ubyte_unaligned_inc (attr->cu->dbg, readp);
+      bool addr64 = attr->cu->address_size == 8;
+      Dwarf_Addr escape = addr64 ? (Elf64_Addr)-1 : (Elf64_Addr)(Elf32_Addr)-1;
 
-         if (begin == (Elf64_Addr) -1l) /* Base address entry.  */
-           {
-             base = end;
-             if (unlikely (base == (Dwarf_Addr) -1))
-               goto invalid;
-             continue;
-           }
-       }
-      else
-       {
-         begin = read_4ubyte_unaligned_inc (attr->cu->dbg, readp);
-         end = read_4ubyte_unaligned_inc (attr->cu->dbg, readp);
+      if (__libdw_read_addr_inc (attr->cu->dbg, &begin, &readp, addr64)
+         || __libdw_read_addr_inc (attr->cu->dbg, &end, &readp, addr64))
+       goto invalid;
 
-         if (begin == (Elf32_Addr) -1) /* Base address entry.  */
-           {
-             base = end;
-             continue;
-           }
+      if (begin == escape)
+       {
+         base = end;
+         if (unlikely (base == escape))
+           goto invalid;
+         continue;
        }
 
       if (begin == 0 && end == 0) /* End of list entry.  */
index 1b054e26d9756a9a7e768442efc74472c82df3d1..2ad0e22cbaed56ed16556a271036286b42677e49 100644 (file)
@@ -124,10 +124,10 @@ get_offsets (Dwarf *dbg)
        }
 
       /* Get the CU offset.  */
-      if (len_bytes == 4)
-       mem[cnt].cu_offset = read_4ubyte_unaligned (dbg, readp + 2);
-      else
-       mem[cnt].cu_offset = read_8ubyte_unaligned (dbg, readp + 2);
+      if (__libdw_read_addr (dbg, &mem[cnt].cu_offset,
+                            readp + 2, len_bytes == 8))
+       /* Error has been already set in reader.  */
+       goto err_return;
 
       /* Determine the size of the CU header.  */
       if (unlikely (dbg->sectiondata[IDX_debug_info] == NULL
@@ -222,10 +222,9 @@ dwarf_getpubnames (dbg, callback, arg, offset)
       while (1)
        {
          /* READP points to the next offset/name pair.  */
-         if (dbg->pubnames_sets[cnt].address_len == 4)
-           gl.die_offset = read_4ubyte_unaligned_inc (dbg, readp);
-         else
-           gl.die_offset = read_8ubyte_unaligned_inc (dbg, readp);
+         if (__libdw_read_addr_inc (dbg, &gl.die_offset, &readp,
+                                    dbg->pubnames_sets[cnt].address_len == 8))
+           return -1l;
 
          /* If the offset is zero we reached the end of the set.  */
          if (gl.die_offset == 0)