From e7765da2aebf919bf3ab8480ac07ccdee42aaf8d Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Tue, 22 May 2018 14:34:06 +0200 Subject: libdw: Handle all address FORMs for dwarf_highpc, handle errors better. dwarf_highpc can use any address FORM, not just DW_FORM_addr. Just try whether the address can be resolved as address. Always set error when attribute couldn't be found or resolved. When calculating the base address for a CU don't try to second guess the error code, just treat an error the same as the attribute not being there. Signed-off-by: Mark Wielaard --- libdw/dwarf_highpc.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) (limited to 'libdw/dwarf_highpc.c') diff --git a/libdw/dwarf_highpc.c b/libdw/dwarf_highpc.c index 1baffa7e..5b2f0fd6 100644 --- a/libdw/dwarf_highpc.c +++ b/libdw/dwarf_highpc.c @@ -47,10 +47,10 @@ dwarf_highpc (Dwarf_Die *die, Dwarf_Addr *return_addr) attr_high = INTUSE(dwarf_attr) (die, DW_AT_high_pc, &attr_high_mem); if (attr_high == NULL) - return -1; + goto no_addr; - if (attr_high->form == DW_FORM_addr) - return INTUSE(dwarf_formaddr) (attr_high, return_addr); + if (INTUSE(dwarf_formaddr) (attr_high, return_addr) == 0) + return 0; /* DWARF 4 allows high_pc to be a constant offset from low_pc. */ if (INTUSE(dwarf_lowpc) (die, return_addr) == 0) @@ -61,8 +61,10 @@ dwarf_highpc (Dwarf_Die *die, Dwarf_Addr *return_addr) *return_addr += uval; return 0; } - __libdw_seterrno (DWARF_E_NO_ADDR); } + +no_addr: + __libdw_seterrno (DWARF_E_NO_ADDR); return -1; } INTDEF(dwarf_highpc) -- cgit v1.2.3