gdb/
authorJan Kratochvil <jan.kratochvil@redhat.com>
Fri, 28 Oct 2011 22:40:58 +0000 (22:40 +0000)
committerJan Kratochvil <jan.kratochvil@redhat.com>
Fri, 28 Oct 2011 22:40:58 +0000 (22:40 +0000)
PR symtab/13208
* 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.

gdb/ChangeLog
gdb/jit.c

index 2e3f06a599dd9254bcd20ed2e1d8a1916f5d3188..d47a3b0fad9173f097e574b6bd974409537f0427 100644 (file)
@@ -1,3 +1,10 @@
+2011-10-28  Jan Kratochvil  <jan.kratochvil@redhat.com>
+
+       PR symtab/13208
+       * 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.
+
 2011-10-28  Pedro Alves  <pedro@codesourcery.com>
 
        * linux-nat.c (linux_nat_filter_event): Remove `options'
index 283ccdb0d313c7b1aa28dff0ba88e7b8966b909f..954d297309a0faa3b04c45f02528e25f4886f14e 100644 (file)
--- 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