From 31e72455c83aba985254392c1ac90aea90628971 Mon Sep 17 00:00:00 2001 From: nathan Date: Sat, 16 Feb 2008 10:51:37 +0000 Subject: [PATCH] * dwarf2.c (find_line): Don't trust debug information after an unparseable compilation unit. --- bfd/ChangeLog | 5 +++++ bfd/dwarf2.c | 69 ++++++++++++++++++++++++++++++----------------------------- 2 files changed, 40 insertions(+), 34 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index c502bba6ab..bb2ace66eb 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,8 @@ +2008-02-16 Nathan Sidwell + + * dwarf2.c (find_line): Don't trust debug information after an + unparseable compilation unit. + 2008-02-15 Alan Modra PR 5765 diff --git a/bfd/dwarf2.c b/bfd/dwarf2.c index ce45995d89..d0b50ff9a1 100644 --- a/bfd/dwarf2.c +++ b/bfd/dwarf2.c @@ -3068,6 +3068,10 @@ find_line (bfd *abfd, { each = parse_comp_unit (stash, length, info_ptr_unit, offset_size); + if (!each) + /* The dwarf information is damaged, don't trust it any + more. */ + break; stash->info_ptr += length; if ((bfd_vma) (stash->info_ptr - stash->sec_info_ptr) @@ -3077,40 +3081,37 @@ find_line (bfd *abfd, stash->sec_info_ptr = stash->info_ptr; } - if (each) - { - if (stash->all_comp_units) - stash->all_comp_units->prev_unit = each; - else - stash->last_comp_unit = each; - - each->next_unit = stash->all_comp_units; - stash->all_comp_units = each; - - /* DW_AT_low_pc and DW_AT_high_pc are optional for - compilation units. If we don't have them (i.e., - unit->high == 0), we need to consult the line info - table to see if a compilation unit contains the given - address. */ - if (do_line) - found = (((symbol->flags & BSF_FUNCTION) == 0 - || each->arange.high == 0 - || comp_unit_contains_address (each, addr)) - && comp_unit_find_line (each, symbol, addr, - filename_ptr, - linenumber_ptr, - stash)); - else - found = ((each->arange.high == 0 - || comp_unit_contains_address (each, addr)) - && comp_unit_find_nearest_line (each, addr, - filename_ptr, - functionname_ptr, - linenumber_ptr, - stash)); - if (found) - goto done; - } + if (stash->all_comp_units) + stash->all_comp_units->prev_unit = each; + else + stash->last_comp_unit = each; + + each->next_unit = stash->all_comp_units; + stash->all_comp_units = each; + + /* DW_AT_low_pc and DW_AT_high_pc are optional for + compilation units. If we don't have them (i.e., + unit->high == 0), we need to consult the line info table + to see if a compilation unit contains the given + address. */ + if (do_line) + found = (((symbol->flags & BSF_FUNCTION) == 0 + || each->arange.high == 0 + || comp_unit_contains_address (each, addr)) + && comp_unit_find_line (each, symbol, addr, + filename_ptr, + linenumber_ptr, + stash)); + else + found = ((each->arange.high == 0 + || comp_unit_contains_address (each, addr)) + && comp_unit_find_nearest_line (each, addr, + filename_ptr, + functionname_ptr, + linenumber_ptr, + stash)); + if (found) + goto done; } } -- 2.11.0