This is the mail archive of the gdb-patches@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

FYI: DWARF psym reader robustness


I am checking this in.

This is a minor DWARF psym reader robustness fix.

If you can manage to make psymtab reading throw an exception, you can
get GDB into a state where the objfile's psymtabs_addrmap is still
mutable.  This means that lookups using this addrmap will cause an
internal_error.

I don't know of a simple way to reproduce this, but I have definitely
run into it.

This patch fixes the problem by installing a cleanup.  It also allocates
the temporary addrmap on a temporary obstack.

Built and regtested on x86-64 (compile farm).

Tom

2010-06-17  Tom Tromey  <tromey@redhat.com>

	* dwarf2read.c (psymtabs_addrmap_cleanup): New function.
	(dwarf2_build_psymtabs_hard): Use it.  Create addrmap on a
	temporary obstack.

Index: dwarf2read.c
===================================================================
RCS file: /cvs/src/src/gdb/dwarf2read.c,v
retrieving revision 1.398
diff -u -r1.398 dwarf2read.c
--- dwarf2read.c	11 Jun 2010 20:01:06 -0000	1.398
+++ dwarf2read.c	17 Jun 2010 17:30:01 -0000
@@ -1995,6 +1995,15 @@
 			  process_type_comp_unit, objfile);
 }
 
+/* A cleanup function that clears objfile's psymtabs_addrmap field.  */
+
+static void
+psymtabs_addrmap_cleanup (void *o)
+{
+  struct objfile *objfile = o;
+  objfile->psymtabs_addrmap = NULL;
+}
+
 /* Build the partial symbol table by doing a quick pass through the
    .debug_info and .debug_abbrev sections.  */
 
@@ -2002,7 +2011,8 @@
 dwarf2_build_psymtabs_hard (struct objfile *objfile)
 {
   gdb_byte *info_ptr;
-  struct cleanup *back_to;
+  struct cleanup *back_to, *addrmap_cleanup;
+  struct obstack temp_obstack;
 
   dwarf2_read_section (objfile, &dwarf2_per_objfile->info);
   info_ptr = dwarf2_per_objfile->info.buffer;
@@ -2015,8 +2025,12 @@
 
   create_all_comp_units (objfile);
 
-  objfile->psymtabs_addrmap =
-    addrmap_create_mutable (&objfile->objfile_obstack);
+  /* Create a temporary address map on a temporary obstack.  We later
+     copy this to the final obstack.  */
+  obstack_init (&temp_obstack);
+  make_cleanup_obstack_free (&temp_obstack);
+  objfile->psymtabs_addrmap = addrmap_create_mutable (&temp_obstack);
+  addrmap_cleanup = make_cleanup (psymtabs_addrmap_cleanup, objfile);
 
   /* Since the objects we're extracting from .debug_info vary in
      length, only the individual functions to extract them (like
@@ -2048,6 +2062,7 @@
 
   objfile->psymtabs_addrmap = addrmap_create_fixed (objfile->psymtabs_addrmap,
 						    &objfile->objfile_obstack);
+  discard_cleanups (addrmap_cleanup);
 
   do_cleanups (back_to);
 }


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]