mirror of
https://github.com/python/cpython.git
synced 2025-08-30 13:38:43 +00:00
Issue #13169: The maximal repetition number in a regular expression has been
increased from 65534 to 2147483647 (on 32-bit platform) or 4294967294 (on 64-bit).
This commit is contained in:
commit
a0eb809995
7 changed files with 62 additions and 13 deletions
|
@ -1,4 +1,5 @@
|
|||
from test.support import verbose, run_unittest, gc_collect, bigmemtest, _2G
|
||||
from test.support import verbose, run_unittest, gc_collect, bigmemtest, _2G, \
|
||||
cpython_only
|
||||
import io
|
||||
import re
|
||||
from re import Scanner
|
||||
|
@ -980,6 +981,37 @@ class ReTests(unittest.TestCase):
|
|||
self.assertEqual(re.findall(r"(?i)(a)\1", "aa \u0100"), ['a'])
|
||||
self.assertEqual(re.match(r"(?s).{1,3}", "\u0100\u0100").span(), (0, 2))
|
||||
|
||||
def test_repeat_minmax_overflow(self):
|
||||
# Issue #13169
|
||||
string = "x" * 100000
|
||||
self.assertEqual(re.match(r".{65535}", string).span(), (0, 65535))
|
||||
self.assertEqual(re.match(r".{,65535}", string).span(), (0, 65535))
|
||||
self.assertEqual(re.match(r".{65535,}?", string).span(), (0, 65535))
|
||||
self.assertEqual(re.match(r".{65536}", string).span(), (0, 65536))
|
||||
self.assertEqual(re.match(r".{,65536}", string).span(), (0, 65536))
|
||||
self.assertEqual(re.match(r".{65536,}?", string).span(), (0, 65536))
|
||||
# 2**128 should be big enough to overflow both SRE_CODE and Py_ssize_t.
|
||||
self.assertRaises(OverflowError, re.compile, r".{%d}" % 2**128)
|
||||
self.assertRaises(OverflowError, re.compile, r".{,%d}" % 2**128)
|
||||
self.assertRaises(OverflowError, re.compile, r".{%d,}?" % 2**128)
|
||||
self.assertRaises(OverflowError, re.compile, r".{%d,%d}" % (2**129, 2**128))
|
||||
|
||||
@cpython_only
|
||||
def test_repeat_minmax_overflow_maxrepeat(self):
|
||||
try:
|
||||
from _sre import MAXREPEAT
|
||||
except ImportError:
|
||||
self.skipTest('requires _sre.MAXREPEAT constant')
|
||||
string = "x" * 100000
|
||||
self.assertIsNone(re.match(r".{%d}" % (MAXREPEAT - 1), string))
|
||||
self.assertEqual(re.match(r".{,%d}" % (MAXREPEAT - 1), string).span(),
|
||||
(0, 100000))
|
||||
self.assertIsNone(re.match(r".{%d,}?" % (MAXREPEAT - 1), string))
|
||||
self.assertRaises(OverflowError, re.compile, r".{%d}" % MAXREPEAT)
|
||||
self.assertRaises(OverflowError, re.compile, r".{,%d}" % MAXREPEAT)
|
||||
self.assertRaises(OverflowError, re.compile, r".{%d,}?" % MAXREPEAT)
|
||||
|
||||
|
||||
def run_re_tests():
|
||||
from test.re_tests import tests, SUCCEED, FAIL, SYNTAX_ERROR
|
||||
if verbose:
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue