From 8219cab3f883cb9981e533407d3ce93d9da7d5f2 Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Fri, 27 Jan 2023 15:16:03 +1030 Subject: [PATCH] Perform cleanup in bfd_close after errors It seems reasonable to continue after errors in bfd_close_all_done, particularly since bfd_close_all_done is typically called on an output file after we've hit some sort of error elsewhere. The iovec test is necessary if bfd_close_all_done is to work on odd bfd's opened by bfd_create. * opncls.c (bfd_close): Call bfd_close_all_done after errors from _bfd_write_contents. (bfd_close_all_done): Call _bfd_delete_bfd after errors. Don't call iovec->bclose when iovec is NULL. --- bfd/opncls.c | 23 ++++++++++------------- 1 file changed, 10 insertions(+), 13 deletions(-) diff --git a/bfd/opncls.c b/bfd/opncls.c index 9241cd1c537..6ae3af054e4 100644 --- a/bfd/opncls.c +++ b/bfd/opncls.c @@ -805,13 +805,10 @@ RETURNS bool bfd_close (bfd *abfd) { - if (bfd_write_p (abfd)) - { - if (! BFD_SEND_FMT (abfd, _bfd_write_contents, (abfd))) - return false; - } + bool ret = (!bfd_write_p (abfd) + || BFD_SEND_FMT (abfd, _bfd_write_contents, (abfd))); - return bfd_close_all_done (abfd); + return bfd_close_all_done (abfd) && ret; } /* @@ -839,15 +836,15 @@ RETURNS bool bfd_close_all_done (bfd *abfd) { - bool ret; + bool ret = BFD_SEND (abfd, _close_and_cleanup, (abfd)); - if (! BFD_SEND (abfd, _close_and_cleanup, (abfd))) - return false; - - ret = abfd->iovec->bclose (abfd) == 0; + if (ret && abfd->iovec != NULL) + { + ret = abfd->iovec->bclose (abfd) == 0; - if (ret) - _maybe_make_executable (abfd); + if (ret) + _maybe_make_executable (abfd); + } _bfd_delete_bfd (abfd); -- 2.30.2