public inbox for binutils-cvs@sourceware.org
 help / color / mirror / Atom feed
* [binutils-gdb] Fix potential infinite loop in bfd_cache_close_all.
@ 2023-08-04 13:19 Nick Clifton
  0 siblings, 0 replies; only message in thread
From: Nick Clifton @ 2023-08-04 13:19 UTC (permalink / raw)
  To: bfd-cvs

https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=0133072f87b7ac0791413870876a0769ca7d44e0

commit 0133072f87b7ac0791413870876a0769ca7d44e0
Author: Nick Clifton <nickc@redhat.com>
Date:   Fri Aug 4 14:19:28 2023 +0100

    Fix potential infinite loop in bfd_cache_close_all.
    
      PR 15545 * cache.c (bfd_cache_close_all): Extend description to note that all files will be closed, even those that are not cacheable. Add code to prevent a possible infinite loop.

Diff:
---
 bfd/ChangeLog |  7 +++++++
 bfd/cache.c   | 15 +++++++++++++--
 2 files changed, 20 insertions(+), 2 deletions(-)

diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 0087aed06a0..14042207ca5 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,10 @@
+2023-08-04  Nick Clifton  <nickc@redhat.com>
+
+	PR 15545
+	* cache.c (bfd_cache_close_all): Extend description to note that
+	all files will be closed, even those that are not cacheable.
+	Add code to prevent a possible infinite loop.
+
 2023-08-02  Tom Tromey  <tromey@adacore.com>
 
 	* pei-x86_64.c (PEI_HEADERS): Do not define.
diff --git a/bfd/cache.c b/bfd/cache.c
index 0c6a948b6d6..357a38da599 100644
--- a/bfd/cache.c
+++ b/bfd/cache.c
@@ -546,7 +546,9 @@ SYNOPSIS
 
 DESCRIPTION
 	Remove all BFDs from the cache. If the attached file is open,
-	then close it too.
+	then close it too.  Note - despite its name this function will
+	close a BFD even if it is not marked as being cacheable, ie
+	even if bfd_get_cacheable() returns false.
 
 	<<FALSE>> is returned if closing one of the file fails, <<TRUE>> is
 	returned if all is well.
@@ -558,7 +560,16 @@ bfd_cache_close_all (void)
   bool ret = true;
 
   while (bfd_last_cache != NULL)
-    ret &= bfd_cache_close (bfd_last_cache);
+    {
+      bfd *prev_bfd_last_cache = bfd_last_cache;
+
+      ret &= bfd_cache_close (bfd_last_cache);
+
+      /* Stop a potential infinite loop should bfd_cache_close()
+	 not update bfd_last_cache.  */
+      if (bfd_last_cache == prev_bfd_last_cache)
+	break;
+    }
 
   return ret;
 }

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2023-08-04 13:19 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-08-04 13:19 [binutils-gdb] Fix potential infinite loop in bfd_cache_close_all Nick Clifton

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).