mirror of
https://github.com/python/cpython.git
synced 2026-04-13 23:31:02 +00:00
gh-146054: Limit the growth of encodings.search_function cache (GH-146055)
This commit is contained in:
parent
99e2c5eccd
commit
9d7621b75b
3 changed files with 18 additions and 0 deletions
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
|
|
|
|||
|
|
@ -0,0 +1,2 @@
|
|||
Limit the size of :func:`encodings.search_function` cache.
|
||||
Found by OSS Fuzz in :oss-fuzz:`493449985`.
|
||||
Loading…
Add table
Add a link
Reference in a new issue