From 1783089b184ddea2081bbe5ac4e80420cb6b0803 Mon Sep 17 00:00:00 2001 From: Petr Machata Date: Thu, 23 Apr 2009 17:44:48 +0200 Subject: [PATCH] Use the new reader hooks in several places --- libdw/ChangeLog | 8 ++++++++ libdw/dwarf_formaddr.c | 7 +++---- libdw/dwarf_formref_die.c | 7 +++---- libdw/dwarf_getlocation.c | 32 +++++++++++--------------------- libdw/dwarf_getpubnames.c | 15 +++++++-------- 5 files changed, 32 insertions(+), 37 deletions(-) diff --git a/libdw/ChangeLog b/libdw/ChangeLog index 953d2c277..55c87014d 100644 --- a/libdw/ChangeLog +++ b/libdw/ChangeLog @@ -1,3 +1,11 @@ +2009-04-23 Petr Machata + + * 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 * libdwP.h (__libdw_read_addr_inc, __libdw_read_off_inc, diff --git a/libdw/dwarf_formaddr.c b/libdw/dwarf_formaddr.c index dcb58d433..aff549155 100644 --- a/libdw/dwarf_formaddr.c +++ b/libdw/dwarf_formaddr.c @@ -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; } diff --git a/libdw/dwarf_formref_die.c b/libdw/dwarf_formref_die.c index 90a4b2d35..3bd89fc13 100644 --- a/libdw/dwarf_formref_die.c +++ b/libdw/dwarf_formref_die.c @@ -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 { diff --git a/libdw/dwarf_getlocation.c b/libdw/dwarf_getlocation.c index f680aa969..5df8cc6f1 100644 --- a/libdw/dwarf_getlocation.c +++ b/libdw/dwarf_getlocation.c @@ -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. */ diff --git a/libdw/dwarf_getpubnames.c b/libdw/dwarf_getpubnames.c index 1b054e26d..2ad0e22cb 100644 --- a/libdw/dwarf_getpubnames.c +++ b/libdw/dwarf_getpubnames.c @@ -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) -- 2.39.5