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.
+2017-08-31 Alan Modra <amodra@gmail.com>
+
+ 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.
+
2017-08-30 H.J. Lu <hongjiu.lu@intel.com>
* elf32-i386.c (elf_i386_plt_type): Removed.
bfd_boolean
bfd_close (bfd *abfd)
{
- bfd_boolean ret;
-
if (bfd_write_p (abfd))
{
if (! BFD_SEND_FMT (abfd, _bfd_write_contents, (abfd)))
return FALSE;
}
- if (! BFD_SEND (abfd, _close_and_cleanup, (abfd)))
- return FALSE;
-
- ret = abfd->iovec->bclose (abfd) == 0;
-
- if (ret)
- _maybe_make_executable (abfd);
-
- _bfd_delete_bfd (abfd);
-
- return ret;
+ return bfd_close_all_done (abfd);
}
/*
{
bfd_boolean ret;
- ret = bfd_cache_close (abfd);
-
if (! BFD_SEND (abfd, _close_and_cleanup, (abfd)))
return FALSE;
+ ret = abfd->iovec->bclose (abfd) == 0;
+
if (ret)
_maybe_make_executable (abfd);