From: Stan Ulbrych <89152624+StanFromIreland@users.noreply.github.com> Date: Tue, 17 Mar 2026 14:02:59 +0000 (+0000) Subject: gh-146054: Limit the growth of `encodings.search_function` cache (GH-146055) X-Git-Tag: v3.15.0a8~277 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=9d7621b75bc4935e14d4f12dffb3cb1d89ea1bc6;p=thirdparty%2FPython%2Fcpython.git gh-146054: Limit the growth of `encodings.search_function` cache (GH-146055) --- diff --git a/Lib/encodings/__init__.py b/Lib/encodings/__init__.py index e205ec326376..169c48324f22 100644 --- a/Lib/encodings/__init__.py +++ b/Lib/encodings/__init__.py @@ -34,6 +34,7 @@ from _codecs import _normalize_encoding from . import aliases _cache = {} +_MAXCACHE = 500 _unknown = '--unknown--' _import_tail = ['*'] _aliases = aliases.aliases @@ -111,6 +112,8 @@ def search_function(encoding): if mod is None: # Cache misses + if len(_cache) >= _MAXCACHE: + _cache.clear() _cache[encoding] = None return None @@ -132,6 +135,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 c31faec9ee52..79c8a7ef8864 100644 --- a/Lib/test/test_codecs.py +++ b/Lib/test/test_codecs.py @@ -3908,5 +3908,16 @@ class CodecNameNormalizationTest(unittest.TestCase): self.assertEqual(normalize('utf\xE9\u20AC\U0010ffff-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 000000000000..8692c7f171d0 --- /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`.