From: Alan Modra Date: Fri, 27 Jan 2023 04:46:03 +0000 (+1030) Subject: Perform cleanup in bfd_close after errors X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=8219cab3f8;p=binutils-gdb.git 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. --- 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);