From: Nick Clifton Date: Fri, 4 Aug 2023 13:19:28 +0000 (+0100) Subject: Fix potential infinite loop in bfd_cache_close_all. X-Git-Tag: upstream/2.42~2012 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=0133072f87b7ac0791413870876a0769ca7d44e0;p=platform%2Fupstream%2Fbinutils.git 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 + + 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 0c6a948..357a38d 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; }