From 0133072f87b7ac0791413870876a0769ca7d44e0 Mon Sep 17 00:00:00 2001 From: Nick Clifton Date: Fri, 4 Aug 2023 14:19:28 +0100 Subject: [PATCH] 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. --- 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 + + 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 * 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. <> is returned if closing one of the file fails, <> 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; } -- 2.30.2