From 6296342ec4473352483eaa82f0553d4a209319a1 Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Tue, 31 Jan 2023 12:39:29 +1030 Subject: [PATCH] PR 30060, ASAN error in bfd_cache_close After bfd_close nothing should access bfd memory. Now that bfd_close always tidies up even after an error, attempting to tidy the cached bfd list by calling bfd_cache_close is wrong and not needed. PR 30060 * ar.c (remove_output): Don't call bfd_cache_close. (output_bfd): Delete. * arsup.c (ar_end): Call bfd_close_all_done, not bfd_cache_close. --- binutils/ar.c | 6 ------ binutils/arsup.c | 5 +++-- 2 files changed, 3 insertions(+), 8 deletions(-) diff --git a/binutils/ar.c b/binutils/ar.c index f8b161aaf5a..2c901ca327c 100644 --- a/binutils/ar.c +++ b/binutils/ar.c @@ -431,15 +431,12 @@ normalize (const char *file, bfd *abfd) static const char *output_filename = NULL; static FILE *output_file = NULL; -static bfd *output_bfd = NULL; static void remove_output (void) { if (output_filename != NULL) { - if (output_bfd != NULL) - bfd_cache_close (output_bfd); if (output_file != NULL) fclose (output_file); unlink_if_ordinary (output_filename); @@ -1272,8 +1269,6 @@ write_archive (bfd *iarch) bfd_fatal (old_name); } - output_bfd = obfd; - bfd_set_format (obfd, bfd_archive); /* Request writing the archive symbol table unless we've @@ -1303,7 +1298,6 @@ write_archive (bfd *iarch) if (!bfd_close (obfd)) bfd_fatal (old_name); - output_bfd = NULL; output_filename = NULL; /* We don't care if this fails; we might be creating the archive. */ diff --git a/binutils/arsup.c b/binutils/arsup.c index 8ffb5f34a2d..744a8d423af 100644 --- a/binutils/arsup.c +++ b/binutils/arsup.c @@ -469,8 +469,9 @@ ar_end (void) { if (obfd) { - bfd_cache_close (obfd); - unlink (bfd_get_filename (obfd)); + const char *filename = bfd_get_filename (obfd); + bfd_close_all_done (obfd); + unlink (filename); } } -- 2.30.2