]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commit - bfd/bfd.c
PR24891, objdump memory leaks when parsing malformed archive
authorAlan Modra <amodra@gmail.com>
Wed, 28 Aug 2019 07:04:34 +0000 (16:34 +0930)
committerAlan Modra <amodra@gmail.com>
Wed, 28 Aug 2019 22:20:40 +0000 (07:50 +0930)
commit83cf0d04dcdc9a4e7f105a517390e4c1af444340
tree2dbbfe642b2a4a93041cd660ffe00e3703781d55
parent48352473b1d2c213749a324f392cf8ec53d273a6
PR24891, objdump memory leaks when parsing malformed archive

BFD was leaking memory in bfd_check_format_matches.  As part of
deciding the proper format of an archive, BFD looks at the format of
the first file stored.  That file's bfd was left open for reasons
given in a comment removed in git commit 0e71e4955cd1 that said:
             /* We ought to close `first' here, but we can't, because
                we have no way to remove it from the archive cache.
                It's close to impossible to figure out when we can
                release bfd_ardata.  FIXME.  */
Well, things have changed since that comment was true and we now can
remove files from the archive cache.  Closing the first file is good
and cures some of the leaks.  Other leaks are caused by
bfd_check_format_matches throwing away bfd tdata before trying a new
match.  That lost the element cache set up when format checking the
first element in the archive.  The easiest and cleanest fix is to
simply disable the caching when checking the first element.

PR 24891
* bfd.c (struct bfd): Add no_element_cache.
* archive.c (_bfd_get_elt_at_filepos): Don't add element to
archive cache when no_element_cache.
(bfd_generic_archive_p): Set no_element_cache when opening first
element to check format.  Close first element too.
(do_slurp_bsd_armap): Don't zero ardata->cache here.
* bfd-in2.h: Regenerate.
bfd/ChangeLog
bfd/archive.c
bfd/bfd-in2.h
bfd/bfd.c