summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPetr Machata <pmachata@redhat.com>2009-05-07 21:02:33 +0200
committerPetr Machata <pmachata@redhat.com>2009-05-07 21:02:33 +0200
commitf3df61f7514b4c217b4bf16a62c93493bb1fef56 (patch)
tree34d6a560d3d148217b27a7f7d9cc46389889937c
parentd24c7bfeca98d0142bb46a44e248f57675a8c0c3 (diff)
downloadelfutils-f3df61f7514b4c217b4bf16a62c93493bb1fef56.tar.gz
Fix dwarf_getmacros so that it passes newly-added test
-rw-r--r--libdw/ChangeLog5
-rw-r--r--libdw/dwarf_getmacros.c21
2 files changed, 16 insertions, 10 deletions
diff --git a/libdw/ChangeLog b/libdw/ChangeLog
index 93a59673..a3d9170a 100644
--- a/libdw/ChangeLog
+++ b/libdw/ChangeLog
@@ -1,3 +1,8 @@
+2009-05-07 Petr Machata <pmachata@redhat.com>
+
+ * dwarf_getmacros.c (dwarf_getmacros): Take into account offset in
+ DW_AT_macro_info attribute of CU DIE.
+
2009-04-15 Roland McGrath <roland@redhat.com>
* dwarf.h (DW_CIE_ID): Removed.
diff --git a/libdw/dwarf_getmacros.c b/libdw/dwarf_getmacros.c
index 743ade3b..5f24d37b 100644
--- a/libdw/dwarf_getmacros.c
+++ b/libdw/dwarf_getmacros.c
@@ -75,17 +75,20 @@ dwarf_getmacros (die, callback, arg, offset)
if (INTUSE(dwarf_formudata) (&attr, &macoff) != 0)
return -1;
- const unsigned char *readp
- = die->cu->dbg->sectiondata[IDX_debug_macinfo]->d_buf + offset;
- const unsigned char *readendp
- = readp + die->cu->dbg->sectiondata[IDX_debug_macinfo]->d_size;
+ Elf_Data *d = die->cu->dbg->sectiondata[IDX_debug_macinfo];
+ if (unlikely (d == NULL) || unlikely (d->d_buf == NULL))
+ {
+ __libdw_seterrno (DWARF_E_NO_ENTRY);
+ return -1;
+ }
+
+ const unsigned char *macdata = d->d_buf + macoff;
+ const unsigned char *readp = macdata + offset;
+ const unsigned char *readendp = d->d_buf + d->d_size;
if (readp == readendp)
return 0;
- if (*readp != DW_MACINFO_start_file)
- goto invalid;
-
while (readp < readendp)
{
unsigned int opcode = *readp++;
@@ -142,9 +145,7 @@ dwarf_getmacros (die, callback, arg, offset)
mac.param2.s = str;
if (callback (&mac, arg) != DWARF_CB_OK)
- return (readp
- - ((unsigned char *) die->cu->dbg->sectiondata[IDX_debug_macinfo]->d_buf
- + offset));
+ return readp - macdata;
}
/* If we come here the termination of the data for the CU is not