This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
Re: [PATCH] Remove gdb_bfd_stash_filename to fix crash with fix of binutils/11983
- From: Hui Zhu <hui_zhu at mentor dot com>
- To: Tom Tromey <tromey at redhat dot com>
- Cc: Sergio Durigan Junior <sergiodj at redhat dot com>, gdb-patches ml <gdb-patches at sourceware dot org>, Edjunior Barbosa Machado <emachado at linux dot vnet dot ibm dot com>, Nick Clifton <nickc at redhat dot com>
- Date: Mon, 6 Jan 2014 18:50:39 +0800
- Subject: Re: [PATCH] Remove gdb_bfd_stash_filename to fix crash with fix of binutils/11983
- Authentication-results: sourceware.org; auth=none
- References: <52C8358B dot 7080101 at mentor dot com> <m3mwja5v01 dot fsf at redhat dot com> <52C97EC0 dot 3080807 at mentor dot com> <87k3edseia dot fsf at fleche dot redhat dot com>
On 01/06/14 16:25, Tom Tromey wrote:
"Hui" == Hui Zhu <hui_zhu@mentor.com> writes:
Hui> Thanks. Post a new version.
Thanks Hui. This is definitely the direction I think the code should
go.
Hui> --- a/gdb/symfile-mem.c
Hui> +++ b/gdb/symfile-mem.c
Hui> @@ -104,11 +104,7 @@ symbol_file_add_from_memory (struct bfd
Hui> if (name == NULL)
Hui> nbfd-> filename = "shared object read from target memory";
Hui> else
Hui> - {
Hui> - nbfd->filename = name;
Hui> - gdb_bfd_stash_filename (nbfd);
Hui> - xfree (name);
Hui> - }
Hui> + nbfd->filename = name;
Hui> cleanup = make_cleanup_bfd_unref (nbfd);
In this hunk there are two things to note.
First, there is an earlier assignment to filename (in the context above)
that should use xstrdup.
Second, the new assignment really ought to free the old nbfd->filename
first.
I changed this part to:
xfree (bfd_get_filename (nbfd));
if (name == NULL)
nbfd->filename = xstrdup ("shared object read from target memory");
else
nbfd->filename = name;
There are also some assignments that must be fixed that do not use
gdb_bfd_stash_filename:
solib-aix.c:solib_aix_bfd_open
solib-darwin.c:darwin_bfd_open
I fixed them.
solib-spu.c:spu_bfd_open
spu-linux-nat.c:spu_bfd_open
These two functions have used xstrdup, for example:
if (sect_size > 20)
{
char *buf = alloca (sect_size - 20 + strlen (original_name) + 1);
bfd_get_section_contents (abfd, spu_name, buf, 20, sect_size - 20);
buf[sect_size - 20] = '\0';
strcat (buf, original_name);
xfree ((char *)abfd->filename);
abfd->filename = xstrdup (buf);
}
So I didn't update them.
If you don't get to this soon, no worries, I will add these to your
patch tomorrow morning and check it in.
Tom
Thunderbird and maybe some others will see some empty lines because this patch include page identifier.
Thanks,
Hui
2014-01-06 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.
--- a/gdb/gdb_bfd.c
+++ b/gdb/gdb_bfd.c
@@ -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 ch
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, con
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, con
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, con
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 *filenam
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, c
bfd *result = bfd_fdopenr (filename, target, fd);
if (result)
- {
- gdb_bfd_ref (result);
- gdb_bfd_stash_filename (result);
- }
+ gdb_bfd_ref (result);
return result;
}
--- a/gdb/gdb_bfd.h
+++ b/gdb/gdb_bfd.h
@@ -24,12 +24,6 @@
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, unsig
/* 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 *fi
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);
--- a/gdb/solib-aix.c
+++ b/gdb/solib-aix.c
@@ -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);
--- a/gdb/solib-darwin.c
+++ b/gdb/solib-darwin.c
@@ -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;
--- a/gdb/symfile-mem.c
+++ b/gdb/symfile-mem.c
@@ -101,14 +101,11 @@ symbol_file_add_from_memory (struct bfd
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);