Kaydet (Commit) abd4553f authored tarafından R. David Murray's avatar R. David Murray

Merged revisions 82730 via svnmerge from

svn+ssh://pythondev@svn.python.org/python/branches/py3k

'merge' in the sense that this is the same fix by the same author.

........
  r82730 | r.david.murray | 2010-07-09 08:23:21 -0400 (Fri, 09 Jul 2010) | 4 lines

  7846: limit fnmatch pattern cache to _MAXCACHE=100 entries.

  Patch by Andrew Clegg.
........
üst 0e6771fd
...@@ -15,6 +15,7 @@ import re ...@@ -15,6 +15,7 @@ import re
__all__ = ["filter", "fnmatch","fnmatchcase","translate"] __all__ = ["filter", "fnmatch","fnmatchcase","translate"]
_cache = {} _cache = {}
_MAXCACHE = 100
def fnmatch(name, pat): def fnmatch(name, pat):
"""Test whether FILENAME matches PATTERN. """Test whether FILENAME matches PATTERN.
...@@ -44,6 +45,8 @@ def filter(names, pat): ...@@ -44,6 +45,8 @@ def filter(names, pat):
pat=os.path.normcase(pat) pat=os.path.normcase(pat)
if not pat in _cache: if not pat in _cache:
res = translate(pat) res = translate(pat)
if len(_cache) >= _MAXCACHE:
_cache.clear()
_cache[pat] = re.compile(res) _cache[pat] = re.compile(res)
match=_cache[pat].match match=_cache[pat].match
if os.path is posixpath: if os.path is posixpath:
...@@ -66,6 +69,8 @@ def fnmatchcase(name, pat): ...@@ -66,6 +69,8 @@ def fnmatchcase(name, pat):
if not pat in _cache: if not pat in _cache:
res = translate(pat) res = translate(pat)
if len(_cache) >= _MAXCACHE:
_cache.clear()
_cache[pat] = re.compile(res) _cache[pat] = re.compile(res)
return _cache[pat].match(name) is not None return _cache[pat].match(name) is not None
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
from test import test_support from test import test_support
import unittest import unittest
from fnmatch import fnmatch, fnmatchcase from fnmatch import fnmatch, fnmatchcase, _MAXCACHE, _cache
class FnmatchTestCase(unittest.TestCase): class FnmatchTestCase(unittest.TestCase):
...@@ -49,6 +49,15 @@ class FnmatchTestCase(unittest.TestCase): ...@@ -49,6 +49,15 @@ class FnmatchTestCase(unittest.TestCase):
check('AbC', 'abc', 0, fnmatchcase) check('AbC', 'abc', 0, fnmatchcase)
check('abc', 'AbC', 0, fnmatchcase) check('abc', 'AbC', 0, fnmatchcase)
def test_cache_clearing(self):
# check that caches do not grow too large
# http://bugs.python.org/issue7846
# string pattern cache
for i in range(_MAXCACHE + 1):
fnmatch('foo', '?' * i)
self.assertLessEqual(len(_cache), _MAXCACHE)
def test_main(): def test_main():
test_support.run_unittest(FnmatchTestCase) test_support.run_unittest(FnmatchTestCase)
......
...@@ -144,6 +144,7 @@ Vadim Chugunov ...@@ -144,6 +144,7 @@ Vadim Chugunov
David Cinege David Cinege
Mike Clarkson Mike Clarkson
Brad Clements Brad Clements
Andrew Clegg
Steve Clift Steve Clift
Nick Coghlan Nick Coghlan
Josh Cogliati Josh Cogliati
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment