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 --git a/bfd/ChangeLog b/bfd/ChangeLog
index 0087aed..1404220 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 0c6a948..357a38d 100644
--- a/bfd/cache.c
+++ b/bfd/cache.c
@@ -546,7 +546,9 @@
 
 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 @@
   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;
 }