diff options
author | Doug Evans <dje@google.com> | 2013-06-19 04:38:51 +0000 |
---|---|---|
committer | Doug Evans <dje@google.com> | 2013-06-19 04:38:51 +0000 |
commit | 3190f0c611ee86ceed79743d228cfb0edc084ed0 (patch) | |
tree | 057c8ae2357d8a58f97de6444d95329b5552ea76 /gdb/dwarf2read.c | |
parent | 937c708cce5bb301876f73733c3478cd17ac4d1a (diff) | |
download | gdb-3190f0c611ee86ceed79743d228cfb0edc084ed0.zip gdb-3190f0c611ee86ceed79743d228cfb0edc084ed0.tar.gz gdb-3190f0c611ee86ceed79743d228cfb0edc084ed0.tar.bz2 |
* 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.
Diffstat (limited to 'gdb/dwarf2read.c')
-rw-r--r-- | gdb/dwarf2read.c | 43 |
1 files changed, 33 insertions, 10 deletions
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); |