This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH 3/5] remove deleted BFDs from the archive cache


On Fri, Aug 17, 2012 at 9:09 AM, Tom Tromey <tromey@redhat.com> wrote:
> Alan> Tom said he'd look into fixing the leak this causes, so I'm happy
> Alan> to leave that to him.  :)
>
> Here's the patch.
>
> I think it would be good for someone to double check it.
>
> I wrote this patch by searching for all the places that could allocate
> an areltdata and changing them to use bfd_zmalloc.
>
> Then I examined all the users of bfd->arelt_data and all callers of
> bfd_read_ar_hdr (and _bfd_read_ar_hdr) to see how the data was used.
> This revealed a number of spots that used bfd_release to free this data.
>
> Finally, I added a free to _bfd_delete_bfd.
>
> I once again built ld and all the binutils programs with -lmcheck, and
> then ran the test suites.  These all passed.  I also ran a single 'ar'
> test (one that was failing yesterday) plus the new 'bfdtest1' test under
> valgrind.  These were also clean.
>
>
> I found a few oddities in BFD while working on this patch:
>
> * _bfd_get_elt_at_filepos can release new_areldata but still leave a
>   stale pointer in n_nfd->arelt_data.  I fixed this.  I am not sure if
>   this can ever result in a bug, but I think paranoia is preferable.
>
> * bfd_slurp_bsd_armap_f2 leaks 'mapdata' before the patch -- it frees it
>   on the error path but not on the normal path.  I fixed this.
>
> * _bfd_xcoff_read_ar_hdr currently allocates 'ret' with bfd_alloc.  I
>   think it should clear it instead; I did this.
>   Also, this function already assumes 'ret' is malloced, which is a
>   latent bug.
>
>
> One final note on arelt_data: right now it is a void* in the BFD.  It
> seems to me that it would be just as opaque, and more type-safe, to
> change the structure name to 'struct bfd_areltdata', then use this name
> in the BFD -- but leave the struct type incomplete so that library
> clients can't dereference it.
>
> Tom
>
> 2012-08-17  Tom Tromey  <tromey@redhat.com>
>
>         * vms-lib.c (_bfd_vms_lib_get_module): Use bfd_zmalloc for
>         areltdata.
>         * opncls.c (_bfd_delete_bfd): Free arelt_data.
>         * mach-o.c (bfd_mach_o_fat_member_init): Use bfd_zmalloc for
>         areltdata.
>         * ecoff.c (_bfd_ecoff_slurp_armap): Use free for mapdata.
>         * coff-rs6000.c (_bfd_xcoff_read_ar_hdr): Use bfd_zmalloc for
>         areltdata.
>         (xcoff_write_archive_contents_old): Likewise.
>         (xcoff_write_archive_contents_big): Likewise.
>         * archive64.c (bfd_elf64_archive_slurp_armap): Use free for
>         areltdata.
>         * archive.c (_bfd_generic_read_ar_hdr_mag): Use bfd_zmalloc and
>         free for areltdata.
>         (_bfd_get_elt_at_filepos): Likewise.  Clear n_nfd->arelt_data on
>         failure.
>         (do_slurp_bsd_armap): Use bfd_zmalloc and free for areltdata.
>         (do_slurp_coff_armap): Likewise.
>         (_bfd_slurp_extended_name_table): Likewise.
>         (bfd_slurp_bsd_armap_f2): Likewise.  Don't leak 'mapdata'.

I am not sure if we want to use bfd_zmalloc for all areltdata.  We
use bfd_ar_hdr_from_filesystem since we can't use member
objalloc nor archive objalloc.  In all other places, it is OK to
use archive objalloc for areltdata.

Do you have a testcase to show there is a problem?

Thanks.

-- 
H.J.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]