summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDoug Evans <dje@google.com>2013-06-19 04:38:50 +0000
committerDoug Evans <dje@google.com>2013-06-19 04:38:50 +0000
commit992b7e18359519bb2ab0829ca022ae3de768beeb (patch)
treeb3330d76a0abdabb7d824bbc3ff27ecf3a6842fe
parent1484358ed3d19c6c8cfdf45d506ffde633ca7b6e (diff)
downloadgdb-992b7e18359519bb2ab0829ca022ae3de768beeb.tar.gz
* 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.
-rw-r--r--gdb/ChangeLog8
-rw-r--r--gdb/dwarf2read.c43
2 files changed, 41 insertions, 10 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 457bec6615d..e4008a508d1 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,11 @@
+2013-06-18 Doug Evans <dje@google.com>
+
+ * 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 <brobecker@adacore.com>
* machoread.c (oso_vector): Delete this global.
diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c
index 0cb9568a96e..555698a0800 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);