From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 12616 invoked by alias); 6 Jan 2014 10:50:51 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Received: (qmail 12478 invoked by uid 89); 6 Jan 2014 10:50:50 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.9 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.2 X-HELO: relay1.mentorg.com Received: from relay1.mentorg.com (HELO relay1.mentorg.com) (192.94.38.131) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Mon, 06 Jan 2014 10:50:48 +0000 Received: from svr-orw-exc-10.mgc.mentorg.com ([147.34.98.58]) by relay1.mentorg.com with esmtp id 1W07lb-00059i-Me from Hui_Zhu@mentor.com ; Mon, 06 Jan 2014 02:50:43 -0800 Received: from SVR-ORW-FEM-04.mgc.mentorg.com ([147.34.97.41]) by SVR-ORW-EXC-10.mgc.mentorg.com with Microsoft SMTPSVC(6.0.3790.4675); Mon, 6 Jan 2014 02:50:43 -0800 Received: from [127.0.0.1] (147.34.91.1) by svr-orw-fem-04.mgc.mentorg.com (147.34.97.41) with Microsoft SMTP Server id 14.2.247.3; Mon, 6 Jan 2014 02:50:42 -0800 Message-ID: <52CA8A7F.7090907@mentor.com> Date: Mon, 06 Jan 2014 10:50:00 -0000 From: Hui Zhu User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:27.0) Gecko/20100101 Thunderbird/27.0 MIME-Version: 1.0 To: Tom Tromey CC: Sergio Durigan Junior , gdb-patches ml , Edjunior Barbosa Machado , Nick Clifton Subject: Re: [PATCH] Remove gdb_bfd_stash_filename to fix crash with fix of binutils/11983 References: <52C8358B.7080101@mentor.com> <52C97EC0.3080807@mentor.com> <87k3edseia.fsf@fleche.redhat.com> In-Reply-To: <87k3edseia.fsf@fleche.redhat.com> Content-Type: text/plain; charset="ISO-8859-1"; format=flowed Content-Transfer-Encoding: 7bit X-IsSubscribed: yes X-SW-Source: 2014-01/txt/msg00053.txt.bz2 On 01/06/14 16:25, Tom Tromey wrote: >>>>>> "Hui" == Hui Zhu 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 * 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);