From: Mark Wielaard Date: Thu, 31 May 2018 11:01:39 +0000 (+0200) Subject: libdw: Don't crash on invalid die in dwarf_dieoffset. X-Git-Tag: elfutils-0.171~8 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=aa02fb9028abcadaa18440b86b1ed085e029956c;p=thirdparty%2Felfutils.git libdw: Don't crash on invalid die in dwarf_dieoffset. Add explicit test in get-units-invalid for dwarf_cuoffset and dwarf_dieoffset. Make sure dwarf_dieoffset returns (Dwarf_Off) -1 on failure. Signed-off-by: Mark Wielaard --- diff --git a/libdw/ChangeLog b/libdw/ChangeLog index 5a33d9c12..38b45badd 100644 --- a/libdw/ChangeLog +++ b/libdw/ChangeLog @@ -1,3 +1,8 @@ +2018-05-31 Mark Wielaard + + * dwarf_dieoffset.c: Check die->cu != NULL. Return -1, not ~0ul + on failure. + 2018-05-29 Mark Wielaard * dwarf_cuoffset.c (dwarf_cuoffset): Check die->cu is not NULL. diff --git a/libdw/dwarf_dieoffset.c b/libdw/dwarf_dieoffset.c index 8028f6dd2..3a8e2cb69 100644 --- a/libdw/dwarf_dieoffset.c +++ b/libdw/dwarf_dieoffset.c @@ -38,8 +38,8 @@ Dwarf_Off dwarf_dieoffset (Dwarf_Die *die) { - return (die == NULL - ? ~0ul + return ((die == NULL || die->cu == NULL) + ? (Dwarf_Off) -1 : (Dwarf_Off) (die->addr - die->cu->startp + die->cu->start)); } INTDEF(dwarf_dieoffset) diff --git a/src/ChangeLog b/src/ChangeLog index f424fb7f6..03ed5aabd 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,7 @@ +2018-05-31 Mark Wielaard + + * readelf.c (print_debug_units): Check offset against -1 not ~0ul. + 2018-05-29 Mark Wielaard * readelf.c (print_debug_loc_section): Handle GNU DebugFission list diff --git a/src/readelf.c b/src/readelf.c index 2ccbea5b7..470a94eb4 100644 --- a/src/readelf.c +++ b/src/readelf.c @@ -7588,7 +7588,7 @@ print_debug_units (Dwfl_Module *dwflmod, do { Dwarf_Off offset = dwarf_dieoffset (&dies[level]); - if (unlikely (offset == ~0ul)) + if (unlikely (offset == (Dwarf_Off) -1)) { if (!silent) error (0, 0, gettext ("cannot get DIE offset: %s"), diff --git a/tests/ChangeLog b/tests/ChangeLog index b656bee7a..521df52f2 100644 --- a/tests/ChangeLog +++ b/tests/ChangeLog @@ -1,3 +1,8 @@ +2018-05-31 Mark Wielaard + + * get-units-invalid.c (main): Check dwarf_cuoffset and + dwarf_dieoffset. + 2018-05-29 Mark Wielaard * dwarf-die-addr-die.c (check_dbg): Also check subdies, split or diff --git a/tests/get-units-invalid.c b/tests/get-units-invalid.c index 58b32c0e6..ba0f818d9 100644 --- a/tests/get-units-invalid.c +++ b/tests/get-units-invalid.c @@ -83,7 +83,19 @@ main (int argc, char *argv[]) if (dwarf_ranges (&subdie, 0, &base, &start, &end) != -1) { printf ("Should NOT have a ranges: %s\n", - dwarf_diename (&result)); + dwarf_diename (&subdie)); + return -1; + } + if (dwarf_cuoffset (&subdie) != (Dwarf_Off) -1) + { + printf ("Should NOT have a cuoffset: %s\n", + dwarf_diename (&subdie)); + return -1; + } + if (dwarf_dieoffset (&subdie) != (Dwarf_Off) -1) + { + printf ("Should NOT have a die offset: %s\n", + dwarf_diename (&subdie)); return -1; } }