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]

[patch] Fix JIT crash on invalid DWARF (PR 13208)


Hi,

reproduced the crash by corrupted gdb.base/jit-solib.so .
	Dwarf Error: Could not find abbrev number 15 [in module <in-memory>]

jit_register_code looks like written according to symbol_file_add_from_memory
but the objects ownership is changed and wrong.

Put there also a missing check for NULL failure.

No regressions on {x86_64,x86_64-m32,i686}-fedora16pre-linux-gnu.
I will check it in.


Thanks,
Jan


gdb/
2011-10-15  Jan Kratochvil  <jan.kratochvil@redhat.com>

	* jit.c (jit_register_code): Remove unused variable my_cleanups.  Check
	for NULL from bfd_open_from_target_memory.  Fix ownership of NBFD and
	SAI.

--- a/gdb/jit.c
+++ b/gdb/jit.c
@@ -253,7 +253,7 @@ jit_register_code (struct gdbarch *gdbarch,
   struct section_addr_info *sai;
   struct bfd_section *sec;
   struct objfile *objfile;
-  struct cleanup *old_cleanups, *my_cleanups;
+  struct cleanup *old_cleanups;
   int i;
   const struct bfd_arch_info *b;
   CORE_ADDR *entry_addr_ptr;
@@ -267,7 +267,11 @@ jit_register_code (struct gdbarch *gdbarch,
 
   nbfd = bfd_open_from_target_memory (code_entry->symfile_addr,
                                       code_entry->symfile_size, gnutarget);
-  old_cleanups = make_cleanup_bfd_close (nbfd);
+  if (nbfd == NULL)
+    {
+      puts_unfiltered (_("Error opening JITed symbol file, ignoring it.\n"));
+      return;
+    }
 
   /* Check the format.  NOTE: This initializes important data that GDB uses!
      We would segfault later without this line.  */
@@ -275,7 +279,7 @@ jit_register_code (struct gdbarch *gdbarch,
     {
       printf_unfiltered (_("\
 JITed symbol file is not an object file, ignoring it.\n"));
-      do_cleanups (old_cleanups);
+      bfd_close (nbfd);
       return;
     }
 
@@ -290,7 +294,7 @@ JITed symbol file is not an object file, ignoring it.\n"));
      file is generated by the JIT at runtime, it should all of the absolute
      addresses that we care about.  */
   sai = alloc_section_addr_info (bfd_count_sections (nbfd));
-  make_cleanup_free_section_addr_info (sai);
+  old_cleanups = make_cleanup_free_section_addr_info (sai);
   i = 0;
   for (sec = nbfd->sections; sec != NULL; sec = sec->next)
     if ((bfd_get_section_flags (nbfd, sec) & (SEC_ALLOC|SEC_LOAD)) != 0)
@@ -303,7 +307,7 @@ JITed symbol file is not an object file, ignoring it.\n"));
         ++i;
       }
 
-  /* This call takes ownership of sai.  */
+  /* This call takes ownership of NBFD.  It does not take ownership of SAI.  */
   objfile = symbol_file_add_from_bfd (nbfd, 0, sai, OBJF_SHARED, NULL);
 
   /* Remember a mapping from entry_addr to objfile.  */
@@ -311,7 +315,7 @@ JITed symbol file is not an object file, ignoring it.\n"));
   *entry_addr_ptr = entry_addr;
   set_objfile_data (objfile, jit_objfile_data, entry_addr_ptr);
 
-  discard_cleanups (old_cleanups);
+  do_cleanups (old_cleanups);
 }
 
 /* This function unregisters JITed code and frees the corresponding


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