This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
FYI: DWARF psym reader robustness
- From: Tom Tromey <tromey at redhat dot com>
- To: gdb-patches at sourceware dot org
- Date: Thu, 17 Jun 2010 11:36:19 -0600
- Subject: FYI: DWARF psym reader robustness
- Reply-to: Tom Tromey <tromey at redhat dot com>
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);
}