bfd_close_all_done calling _close_and_cleanup
authorAlan Modra <amodra@gmail.com>
Wed, 30 Aug 2017 23:16:47 +0000 (08:46 +0930)
committerAlan Modra <amodra@gmail.com>
Thu, 31 Aug 2017 01:00:07 +0000 (10:30 +0930)
commite234de6be5cc96286e0efb90e8d9fce51239e901
tree51026a979501f87cc616f77feb578ce31ad2124b
parente69f32654ac724c46c0f4f645c8a49189c7b43e4
bfd_close_all_done calling _close_and_cleanup

elf64_vms_close_and_cleanup calls bfd_get_size, which calls
iovec->bstat.  cache_bstat ends up adding the bfd to the cache lru
list, negating the bfd_cache_close call in bfd_close_all_done.  So
there is a dangling pointer into the freed and then reused bfd.  Thus,
bfd_cache_close must be called after _close_and_cleanup, or better,
via iovec->bclose.

PR binutils/22032
* opncls.c (bfd_close_all_done): Don't call bfd_cache_close
before _close_and_cleanup.  Call iovec->bclose after.
(bfd_close): Remove code common to, and call, bfd_close_all_done.
bfd/ChangeLog
bfd/opncls.c