+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,
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;
}
? 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
{
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. */
}
/* 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
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)