diff options
author | Nick Clifton <nickc@redhat.com> | 2018-04-18 12:03:03 +0100 |
---|---|---|
committer | Nick Clifton <nickc@redhat.com> | 2018-04-18 12:03:03 +0100 |
commit | a7504f87d41694d441fabb3308631df4d2750c24 (patch) | |
tree | ae89ddf688dc34d25311bbc1b89a06e7e5544516 /binutils | |
parent | Updated Spanish translation for gprof directory (diff) | |
download | binutils-gdb-a7504f87d41694d441fabb3308631df4d2750c24.tar.gz binutils-gdb-a7504f87d41694d441fabb3308631df4d2750c24.tar.bz2 binutils-gdb-a7504f87d41694d441fabb3308631df4d2750c24.zip |
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.
Diffstat (limited to 'binutils')
-rw-r--r-- | binutils/ChangeLog | 6 | ||||
-rw-r--r-- | binutils/dwarf.c | 25 |
2 files changed, 23 insertions, 8 deletions
diff --git a/binutils/ChangeLog b/binutils/ChangeLog index 3d28535d881..991ebbe4dad 100644 --- a/binutils/ChangeLog +++ b/binutils/ChangeLog @@ -1,3 +1,9 @@ +2018-04-18 Nick Clifton <nickc@redhat.com> + + PR 23062 + * dwarf.c (read_and_display_attr_value): Replace assertions with + test and warning message. + 2018-04-18 Alan Modra <amodra@gmail.com> * testsuite/lib/binutils-common.exp: Remove support for assorted diff --git a/binutils/dwarf.c b/binutils/dwarf.c index f94f5b2fe69..cd3df7fb875 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; |