gh-146054: Limit the growth of encodings.search_function cache (GH-146055)

This commit is contained in:
Stan Ulbrych 2026-03-17 14:02:59 +00:00 committed by GitHub
parent 99e2c5eccd
commit 9d7621b75b
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 18 additions and 0 deletions

View file

@ -34,6 +34,7 @@
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

View file

@ -3908,5 +3908,16 @@ def test_encodings_normalize_encoding(self):
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()

View file

@ -0,0 +1,2 @@
Limit the size of :func:`encodings.search_function` cache.
Found by OSS Fuzz in :oss-fuzz:`493449985`.