* symfile-mem.c (symbol_file_add_from_memory): Call do_cleanups.
authorTom Tromey <tromey@redhat.com>
Thu, 30 Jun 2011 18:48:19 +0000 (18:48 +0000)
committerTom Tromey <tromey@redhat.com>
Thu, 30 Jun 2011 18:48:19 +0000 (18:48 +0000)
* solib-svr4.c (open_symbol_file_object): Call do_cleanups on all
return paths.  Defer final do_cleanups until last return.
* arm-tdep.c (arm_exidx_new_objfile): Make null cleanup after
early return.

gdb/ChangeLog
gdb/arm-tdep.c
gdb/solib-svr4.c
gdb/symfile-mem.c

index 39dd14433334c4b6c6182e02ad1526f97a599552..c625a006ff8571666131ae7864eb38292357a314 100644 (file)
@@ -1,3 +1,11 @@
+2011-06-30  Tom Tromey  <tromey@redhat.com>
+
+       * symfile-mem.c (symbol_file_add_from_memory): Call do_cleanups.
+       * solib-svr4.c (open_symbol_file_object): Call do_cleanups on all
+       return paths.  Defer final do_cleanups until last return.
+       * arm-tdep.c (arm_exidx_new_objfile): Make null cleanup after
+       early return.
+
 2011-06-30  Tom Tromey  <tromey@redhat.com>
 
        * Makefile.in (SUBDIR_MI_CFLAGS): Don't add -DMI_OUT=1.
index 433ce2125e9fcc614eb1a1cb518ea566a322c399..1a75af14bcdec9b09235415b48ad80ba2193a079 100644 (file)
@@ -2211,7 +2211,7 @@ arm_obj_section_from_vma (struct objfile *objfile, bfd_vma vma)
 static void
 arm_exidx_new_objfile (struct objfile *objfile)
 {
-  struct cleanup *cleanups = make_cleanup (null_cleanup, NULL);
+  struct cleanup *cleanups;
   struct arm_exidx_data *data;
   asection *exidx, *extab;
   bfd_vma exidx_vma = 0, extab_vma = 0;
@@ -2222,6 +2222,7 @@ arm_exidx_new_objfile (struct objfile *objfile)
   /* If we've already touched this file, do nothing.  */
   if (!objfile || objfile_data (objfile, arm_exidx_data_key) != NULL)
     return;
+  cleanups = make_cleanup (null_cleanup, NULL);
 
   /* Read contents of exception table and index.  */
   exidx = bfd_get_section_by_name (objfile->obfd, ".ARM.exidx");
index f668f83b9df8450989699cdca31df86014a2eec6..d92a83cb201f33caaa8742969a5813cc28f7f00f 100644 (file)
@@ -1021,17 +1021,26 @@ open_symbol_file_object (void *from_ttyp)
 
   if (symfile_objfile)
     if (!query (_("Attempt to reload symbols from process? ")))
-      return 0;
+      {
+       do_cleanups (cleanups);
+       return 0;
+      }
 
   /* Always locate the debug struct, in case it has moved.  */
   info->debug_base = 0;
   if (locate_base (info) == 0)
-    return 0;  /* failed somehow...  */
+    {
+      do_cleanups (cleanups);
+      return 0;        /* failed somehow...  */
+    }
 
   /* First link map member should be the executable.  */
   lm = solib_svr4_r_map (info);
   if (lm == 0)
-    return 0;  /* failed somehow...  */
+    {
+      do_cleanups (cleanups);
+      return 0;        /* failed somehow...  */
+    }
 
   /* Read address of name from target memory to GDB.  */
   read_memory (lm + lmo->l_name_offset, l_name_buf, l_name_size);
@@ -1039,11 +1048,11 @@ open_symbol_file_object (void *from_ttyp)
   /* Convert the address to host format.  */
   l_name = extract_typed_address (l_name_buf, ptr_type);
 
-  /* Free l_name_buf.  */
-  do_cleanups (cleanups);
-
   if (l_name == 0)
-    return 0;          /* No filename.  */
+    {
+      do_cleanups (cleanups);
+      return 0;                /* No filename.  */
+    }
 
   /* Now fetch the filename from target memory.  */
   target_read_string (l_name, &filename, SO_NAME_MAX_PATH_SIZE - 1, &errcode);
@@ -1053,12 +1062,14 @@ open_symbol_file_object (void *from_ttyp)
     {
       warning (_("failed to read exec filename from attached file: %s"),
               safe_strerror (errcode));
+      do_cleanups (cleanups);
       return 0;
     }
 
   /* Have a pathname: read the symbol file.  */
   symbol_file_add_main (filename, from_tty);
 
+  do_cleanups (cleanups);
   return 1;
 }
 
index 6da5a1c3d398d348e31095675d56f91818d19239..bef28c7ccfa587fb5750de8ed9c3fe1f3839e625 100644 (file)
@@ -72,6 +72,7 @@ symbol_file_add_from_memory (struct bfd *templ, CORE_ADDR addr, char *name,
   bfd_vma loadbase;
   struct section_addr_info *sai;
   unsigned int i;
+  struct cleanup *cleanup;
 
   if (bfd_get_flavour (templ) != bfd_target_elf_flavour)
     error (_("add-symbol-file-from-memory not supported for this target"));
@@ -97,7 +98,7 @@ symbol_file_add_from_memory (struct bfd *templ, CORE_ADDR addr, char *name,
     }
 
   sai = alloc_section_addr_info (bfd_count_sections (nbfd));
-  make_cleanup (xfree, sai);
+  cleanup = make_cleanup (xfree, sai);
   i = 0;
   for (sec = nbfd->sections; sec != NULL; sec = sec->next)
     if ((bfd_get_section_flags (nbfd, sec) & (SEC_ALLOC|SEC_LOAD)) != 0)
@@ -114,6 +115,7 @@ symbol_file_add_from_memory (struct bfd *templ, CORE_ADDR addr, char *name,
   /* This might change our ideas about frames already looked at.  */
   reinit_frame_cache ();
 
+  do_cleanups (cleanup);
   return objf;
 }