aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDoug Evans <dje@google.com>2013-06-19 04:38:51 +0000
committerDoug Evans <dje@google.com>2013-06-19 04:38:51 +0000
commit3190f0c611ee86ceed79743d228cfb0edc084ed0 (patch)
tree057c8ae2357d8a58f97de6444d95329b5552ea76
parent937c708cce5bb301876f73733c3478cd17ac4d1a (diff)
downloadgdb-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.
-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 457bec6..e4008a5 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 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);