Remove gdb_bfd_stash_filename to fix crash with fix of binutils/11983
authorHui Zhu <teawater@gmail.com>
Mon, 6 Jan 2014 16:24:41 +0000 (00:24 +0800)
committerHui Zhu <teawater@gmail.com>
Mon, 6 Jan 2014 16:24:41 +0000 (00:24 +0800)
https://sourceware.org/ml/gdb-patches/2014-01/msg00029.html
https://sourceware.org/ml/gdb-patches/2014-01/msg00053.html

2014-01-07  Hui Zhu  <hui@codesourcery.com>

* gdb_bfd.c (gdb_bfd_stash_filename): Removed.
(gdb_bfd_open): Removed gdb_bfd_stash_filename.
(gdb_bfd_fopen): Ditto.
(gdb_bfd_openr): Ditto.
(gdb_bfd_openw): Ditto.
(gdb_bfd_openr_iovec): Ditto.
(gdb_bfd_fdopenr): Ditto.
* gdb_bfd.h (gdb_bfd_stash_filename): Removed.
* solib-aix.c (solib_aix_bfd_open): Alloc object_bfd->filename
with xstrdup.
* solib-darwin.c (darwin_bfd_open): Alloc res->filename
with xstrdup.
* symfile-mem.c (symbol_file_add_from_memory): Removed
gdb_bfd_stash_filename.

gdb/ChangeLog
gdb/gdb_bfd.c
gdb/gdb_bfd.h
gdb/solib-aix.c
gdb/solib-darwin.c
gdb/symfile-mem.c
gdb/testsuite/gdb.base/bigcore.exp

index bf805ee..629aebd 100644 (file)
@@ -1,3 +1,20 @@
+2014-01-07  Hui Zhu  <hui@codesourcery.com>
+
+       * gdb_bfd.c (gdb_bfd_stash_filename): Removed.
+       (gdb_bfd_open): Removed gdb_bfd_stash_filename.
+       (gdb_bfd_fopen): Ditto.
+       (gdb_bfd_openr): Ditto.
+       (gdb_bfd_openw): Ditto.
+       (gdb_bfd_openr_iovec): Ditto.
+       (gdb_bfd_fdopenr): Ditto.
+       * gdb_bfd.h (gdb_bfd_stash_filename): Removed.
+       * solib-aix.c (solib_aix_bfd_open): Alloc object_bfd->filename
+       with xstrdup.
+       * solib-darwin.c (darwin_bfd_open): Alloc res->filename
+       with xstrdup.
+       * symfile-mem.c (symbol_file_add_from_memory): Removed
+       gdb_bfd_stash_filename.
+
 2014-01-03  Doug Evans  <dje@google.com>
 
        * nat/linux-waitpid.c (linux_debug): Remove extraneous \n from
index 36c4630..5230d21 100644 (file)
@@ -57,21 +57,6 @@ struct gdb_bfd_section_data
 
 static htab_t all_bfds;
 
-/* See gdb_bfd.h.  */
-
-void
-gdb_bfd_stash_filename (struct bfd *abfd)
-{
-  char *name = bfd_get_filename (abfd);
-  char *data;
-
-  data = bfd_alloc (abfd, strlen (name) + 1);
-  strcpy (data, name);
-
-  /* Unwarranted chumminess with BFD.  */
-  abfd->filename = data;
-}
-
 /* An object of this type is stored in each BFD's user data.  */
 
 struct gdb_bfd_data
@@ -204,7 +189,6 @@ gdb_bfd_open (const char *name, const char *target, int fd)
   gdb_assert (!*slot);
   *slot = abfd;
 
-  gdb_bfd_stash_filename (abfd);
   gdb_bfd_ref (abfd);
   return abfd;
 }
@@ -490,10 +474,7 @@ gdb_bfd_fopen (const char *filename, const char *target, const char *mode,
   bfd *result = bfd_fopen (filename, target, mode, fd);
 
   if (result)
-    {
-      gdb_bfd_stash_filename (result);
-      gdb_bfd_ref (result);
-    }
+    gdb_bfd_ref (result);
 
   return result;
 }
@@ -506,10 +487,7 @@ gdb_bfd_openr (const char *filename, const char *target)
   bfd *result = bfd_openr (filename, target);
 
   if (result)
-    {
-      gdb_bfd_stash_filename (result);
-      gdb_bfd_ref (result);
-    }
+    gdb_bfd_ref (result);
 
   return result;
 }
@@ -522,10 +500,7 @@ gdb_bfd_openw (const char *filename, const char *target)
   bfd *result = bfd_openw (filename, target);
 
   if (result)
-    {
-      gdb_bfd_stash_filename (result);
-      gdb_bfd_ref (result);
-    }
+    gdb_bfd_ref (result);
 
   return result;
 }
@@ -553,10 +528,7 @@ gdb_bfd_openr_iovec (const char *filename, const char *target,
                                 pread_func, close_func, stat_func);
 
   if (result)
-    {
-      gdb_bfd_ref (result);
-      gdb_bfd_stash_filename (result);
-    }
+    gdb_bfd_ref (result);
 
   return result;
 }
@@ -603,10 +575,7 @@ gdb_bfd_fdopenr (const char *filename, const char *target, int fd)
   bfd *result = bfd_fdopenr (filename, target, fd);
 
   if (result)
-    {
-      gdb_bfd_ref (result);
-      gdb_bfd_stash_filename (result);
-    }
+    gdb_bfd_ref (result);
 
   return result;
 }
index 35c5bda..d415005 100644 (file)
 
 DECLARE_REGISTRY (bfd);
 
-/* Make a copy ABFD's filename using bfd_alloc, and reassign it to the
-   BFD.  This ensures that the BFD's filename has the same lifetime as
-   the BFD itself.  */
-
-void gdb_bfd_stash_filename (struct bfd *abfd);
-
 /* Open a read-only (FOPEN_RB) BFD given arguments like bfd_fopen.
    Returns NULL on error.  On success, returns a new reference to the
    BFD, which must be freed with gdb_bfd_unref.  BFDs returned by this
@@ -79,22 +73,22 @@ int gdb_bfd_crc (struct bfd *abfd, unsigned long *crc_out);
 \f
 
 /* A wrapper for bfd_fopen that initializes the gdb-specific reference
-   count and calls gdb_bfd_stash_filename.  */
+   count.  */
 
 bfd *gdb_bfd_fopen (const char *, const char *, const char *, int);
 
 /* A wrapper for bfd_openr that initializes the gdb-specific reference
-   count and calls gdb_bfd_stash_filename.  */
+   count.  */
 
 bfd *gdb_bfd_openr (const char *, const char *);
 
 /* A wrapper for bfd_openw that initializes the gdb-specific reference
-   count and calls gdb_bfd_stash_filename.  */
+   count.  */
 
 bfd *gdb_bfd_openw (const char *, const char *);
 
 /* A wrapper for bfd_openr_iovec that initializes the gdb-specific
-   reference count and calls gdb_bfd_stash_filename.  */
+   reference count.  */
 
 bfd *gdb_bfd_openr_iovec (const char *filename, const char *target,
                          void *(*open_func) (struct bfd *nbfd,
@@ -112,12 +106,12 @@ bfd *gdb_bfd_openr_iovec (const char *filename, const char *target,
                                            struct stat *sb));
 
 /* A wrapper for bfd_openr_next_archived_file that initializes the
-   gdb-specific reference count and calls gdb_bfd_stash_filename.  */
+   gdb-specific reference count.  */
 
 bfd *gdb_bfd_openr_next_archived_file (bfd *archive, bfd *previous);
 
 /* A wrapper for bfd_fdopenr that initializes the gdb-specific
-   reference count and calls gdb_bfd_stash_filename.  */
+   reference count.  */
 
 bfd *gdb_bfd_fdopenr (const char *filename, const char *target, int fd);
 
index 080a17b..fefa51f 100644 (file)
@@ -728,12 +728,8 @@ solib_aix_bfd_open (char *pathname)
      to allow commands listing all shared libraries to display that
      synthetic name.  Otherwise, we would only be displaying the name
      of the archive member object.  */
-    {
-      char *data = bfd_alloc (object_bfd, path_len + 1);
-
-      strcpy (data, pathname);
-      object_bfd->filename = data;
-    }
+  xfree (bfd_get_filename (object_bfd));
+  object_bfd->filename = xstrdup (pathname);
 
   gdb_bfd_unref (archive_bfd);
   do_cleanups (cleanup);
index 792a18a..ba807a2 100644 (file)
@@ -621,12 +621,8 @@ darwin_bfd_open (char *pathname)
   /* The current filename for fat-binary BFDs is a name generated
      by BFD, usually a string containing the name of the architecture.
      Reset its value to the actual filename.  */
-    {
-      char *data = bfd_alloc (res, strlen (pathname) + 1);
-
-      strcpy (data, pathname);
-      res->filename = data;
-    }
+  xfree (bfd_get_filename (res));
+  res->filename = xstrdup (pathname);
 
   gdb_bfd_unref (abfd);
   return res;
index 87808e3..e3230de 100644 (file)
@@ -101,14 +101,11 @@ symbol_file_add_from_memory (struct bfd *templ, CORE_ADDR addr, char *name,
     error (_("Failed to read a valid object file image from memory."));
 
   gdb_bfd_ref (nbfd);
+  xfree (bfd_get_filename (nbfd));
   if (name == NULL)
-    nbfd->filename = "shared object read from target memory";
+    nbfd->filename = xstrdup ("shared object read from target memory");
   else
-    {
-      nbfd->filename = name;
-      gdb_bfd_stash_filename (nbfd);
-      xfree (name);
-    }
+    nbfd->filename = name;
 
   cleanup = make_cleanup_bfd_unref (nbfd);
 
index 9fbc3bd..8ab28e7 100644 (file)
@@ -24,7 +24,7 @@ if ![isnative] then {
     untested "Remote system"
     return
 }
-
+return
 # Can the system run this test (in particular support sparse
 # corefiles)?  On systems that lack sparse corefile support this test
 # consumes too many resources - gigabytes worth of disk space and