[commit] minor fixes to iterating over .gdb_index entries

Doug Evans dje@google.com
Wed Jun 19 04:59:00 GMT 2013


Hi.
This patch adds more error checking, and adds a complaint
when bad data is found.

Regression tested on amd64-linux with cc-with-tweaks.sh -i.
Committed.

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.

Index: dwarf2read.c
===================================================================
RCS file: /cvs/src/src/gdb/dwarf2read.c,v
retrieving revision 1.804
diff -u -p -r1.804 dwarf2read.c
--- dwarf2read.c	13 Jun 2013 23:01:37 -0000	1.804
+++ dwarf2read.c	19 Jun 2013 04:21:38 -0000
@@ -3199,7 +3199,7 @@ dw2_symtab_iter_next (struct dw2_symtab_
       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_
 	(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,17 @@ 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);
+	  /* 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);
 
-	  /* 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's kind if it has one.  */
+	  if (attrs_valid)
 	    {
 	      switch (kind)
 		{
@@ -3659,6 +3673,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);



More information about the Gdb-patches mailing list