From 3190f0c611ee86ceed79743d228cfb0edc084ed0 Mon Sep 17 00:00:00 2001 From: Doug Evans Date: Wed, 19 Jun 2013 04:38:51 +0000 Subject: [PATCH] * dwarf2read.c (dw2_symtab_iter_next): Check value of cu_index before using it. (dw2_expand_symtabs_matching): Fix symbol kind validity check. Move test of cu_index closer to use. Print complaint if cu_index is bad. --- gdb/ChangeLog | 8 ++++++++ gdb/dwarf2read.c | 43 +++++++++++++++++++++++++++++++++---------- 2 files changed, 41 insertions(+), 10 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 457bec6..e4008a5 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,11 @@ +2013-06-18 Doug Evans + + * dwarf2read.c (dw2_symtab_iter_next): Check value of cu_index + before using it. + (dw2_expand_symtabs_matching): Fix symbol kind validity check. + Move test of cu_index closer to use. Print complaint if cu_index + is bad. + 2013-06-18 Joel Brobecker * machoread.c (oso_vector): Delete this global. diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c index 0cb9568..555698a 100644 --- a/gdb/dwarf2read.c +++ b/gdb/dwarf2read.c @@ -3199,7 +3199,7 @@ dw2_symtab_iter_next (struct dw2_symtab_iterator *iter) offset_type cu_index_and_attrs = MAYBE_SWAP (iter->vec[iter->next + 1]); offset_type cu_index = GDB_INDEX_CU_VALUE (cu_index_and_attrs); - struct dwarf2_per_cu_data *per_cu = dw2_get_cu (cu_index); + struct dwarf2_per_cu_data *per_cu; int want_static = iter->block_index != GLOBAL_BLOCK; /* This value is only valid for index versions >= 7. */ int is_static = GDB_INDEX_SYMBOL_STATIC_VALUE (cu_index_and_attrs); @@ -3213,6 +3213,18 @@ dw2_symtab_iter_next (struct dw2_symtab_iterator *iter) (iter->index->version >= 7 && symbol_kind != GDB_INDEX_SYMBOL_KIND_NONE); + /* Don't crash on bad data. */ + if (cu_index >= (dwarf2_per_objfile->n_comp_units + + dwarf2_per_objfile->n_type_units)) + { + complaint (&symfile_complaints, + _(".gdb_index entry has bad CU index" + " [in module %s]"), dwarf2_per_objfile->objfile->name); + continue; + } + + per_cu = dw2_get_cu (cu_index); + /* Skip if already read in. */ if (per_cu->v.quick->symtab) continue; @@ -3630,15 +3642,16 @@ dw2_expand_symtabs_matching gdb_index_symbol_kind symbol_kind = GDB_INDEX_SYMBOL_KIND_VALUE (cu_index_and_attrs); int cu_index = GDB_INDEX_CU_VALUE (cu_index_and_attrs); - - /* Don't crash on bad data. */ - if (cu_index >= (dwarf2_per_objfile->n_comp_units - + dwarf2_per_objfile->n_type_units)) - continue; - - /* Only check the symbol's kind if it has one. - Indices prior to version 7 don't record it. */ - if (index->version >= 7) + /* Only check the symbol attributes if they're present. + Indices prior to version 7 don't record them, + and indices >= 7 may elide them for certain symbols + (gold does this). */ + int attrs_valid = + (index->version >= 7 + && symbol_kind != GDB_INDEX_SYMBOL_KIND_NONE); + + /* Only check the symbol's kind if it has one. */ + if (attrs_valid) { switch (kind) { @@ -3659,6 +3672,16 @@ dw2_expand_symtabs_matching } } + /* Don't crash on bad data. */ + if (cu_index >= (dwarf2_per_objfile->n_comp_units + + dwarf2_per_objfile->n_type_units)) + { + complaint (&symfile_complaints, + _(".gdb_index entry has bad CU index" + " [in module %s]"), objfile->name); + continue; + } + per_cu = dw2_get_cu (cu_index); if (file_matcher == NULL || per_cu->v.quick->mark) dw2_instantiate_symtab (per_cu); -- 2.7.4