From 6fe3609ae7d137a84226aed19440960c3f79340f Mon Sep 17 00:00:00 2001 From: Stan Ulbrych <89152624+StanFromIreland@users.noreply.github.com> Date: Tue, 17 Mar 2026 14:02:59 +0000 Subject: [PATCH] gh-146054: Limit the growth of `encodings.search_function` cache (GH-146055) (cherry picked from commit 9d7621b75bc4935e14d4f12dffb3cb1d89ea1bc6) Co-authored-by: Stan Ulbrych <89152624+StanFromIreland@users.noreply.github.com> --- Lib/encodings/__init__.py | 5 +++++ Lib/test/test_codecs.py | 11 +++++++++++ .../2026-03-17-11-46-20.gh-issue-146054.udYcqn.rst | 2 ++ 3 files changed, 18 insertions(+) create mode 100644 Misc/NEWS.d/next/Library/2026-03-17-11-46-20.gh-issue-146054.udYcqn.rst diff --git a/Lib/encodings/__init__.py b/Lib/encodings/__init__.py index 298177eb8003a7..8548bbe04ad37c 100644 --- a/Lib/encodings/__init__.py +++ b/Lib/encodings/__init__.py @@ -33,6 +33,7 @@ from . import aliases _cache = {} +_MAXCACHE = 500 _unknown = '--unknown--' _import_tail = ['*'] _aliases = aliases.aliases @@ -115,6 +116,8 @@ def search_function(encoding): if mod is None: # Cache misses + if len(_cache) >= _MAXCACHE: + _cache.clear() _cache[encoding] = None return None @@ -136,6 +139,8 @@ def search_function(encoding): entry = codecs.CodecInfo(*entry) # Cache the codec registry entry + if len(_cache) >= _MAXCACHE: + _cache.clear() _cache[encoding] = entry # Register its aliases (without overwriting previously registered diff --git a/Lib/test/test_codecs.py b/Lib/test/test_codecs.py index fd7769e8c275d3..1533fdcc9d3483 100644 --- a/Lib/test/test_codecs.py +++ b/Lib/test/test_codecs.py @@ -3907,5 +3907,16 @@ def test_encodings_normalize_encoding(self): self.assertEqual(normalize('utf...8'), 'utf...8') +class CodecCacheTest(unittest.TestCase): + def test_cache_bounded(self): + for i in range(encodings._MAXCACHE + 1000): + try: + b'x'.decode(f'nonexist_{i}') + except LookupError: + pass + + self.assertLessEqual(len(encodings._cache), encodings._MAXCACHE) + + if __name__ == "__main__": unittest.main() diff --git a/Misc/NEWS.d/next/Library/2026-03-17-11-46-20.gh-issue-146054.udYcqn.rst b/Misc/NEWS.d/next/Library/2026-03-17-11-46-20.gh-issue-146054.udYcqn.rst new file mode 100644 index 00000000000000..8692c7f171d0fb --- /dev/null +++ b/Misc/NEWS.d/next/Library/2026-03-17-11-46-20.gh-issue-146054.udYcqn.rst @@ -0,0 +1,2 @@ +Limit the size of :func:`encodings.search_function` cache. +Found by OSS Fuzz in :oss-fuzz:`493449985`.