From a7504f87d41694d441fabb3308631df4d2750c24 Mon Sep 17 00:00:00 2001 From: Nick Clifton Date: Wed, 18 Apr 2018 12:03:03 +0100 Subject: Prevent an assertion failure in readelf & objdump when parsing corrupt DWARF information. PR 23062 * dwarf.c (read_and_display_attr_value): Replace assertions with test and warning message. --- binutils/ChangeLog | 6 ++++++ binutils/dwarf.c | 25 +++++++++++++++++-------- 2 files changed, 23 insertions(+), 8 deletions(-) (limited to 'binutils') diff --git a/binutils/ChangeLog b/binutils/ChangeLog index 3d28535..991ebbe 100644 --- a/binutils/ChangeLog +++ b/binutils/ChangeLog @@ -1,3 +1,9 @@ +2018-04-18 Nick Clifton + + PR 23062 + * dwarf.c (read_and_display_attr_value): Replace assertions with + test and warning message. + 2018-04-18 Alan Modra * testsuite/lib/binutils-common.exp: Remove support for assorted diff --git a/binutils/dwarf.c b/binutils/dwarf.c index f94f5b2..cd3df7f 100644 --- a/binutils/dwarf.c +++ b/binutils/dwarf.c @@ -2174,19 +2174,28 @@ read_and_display_attr_value (unsigned long attribute, debug_info_p->have_frame_base [num] = have_frame_base; if (attribute != DW_AT_GNU_locviews) { - debug_info_p->loc_offsets [num] = uvalue; - debug_info_p->num_loc_offsets++; - assert (debug_info_p->num_loc_offsets - - debug_info_p->num_loc_views <= 1); + /* Corrupt DWARF info can produce more offsets than views. + See PR 23062 for an example. */ + if (debug_info_p->num_loc_offsets + > debug_info_p->num_loc_views) + warn (_("More location offset attributes than DW_AT_GNU_locview attributes\n")); + else + { + debug_info_p->loc_offsets [num] = uvalue; + debug_info_p->num_loc_offsets++; + } } else { assert (debug_info_p->num_loc_views <= num); num = debug_info_p->num_loc_views; - debug_info_p->loc_views [num] = uvalue; - debug_info_p->num_loc_views++; - assert (debug_info_p->num_loc_views - - debug_info_p->num_loc_offsets <= 1); + if (num > debug_info_p->num_loc_offsets) + warn (_("More DW_AT_GNU_locview attributes than location offset attributes\n")); + else + { + debug_info_p->loc_views [num] = uvalue; + debug_info_p->num_loc_views++; + } } } break; -- cgit v1.1