mirror of https://github.com/python/cpython
bpo-46707: Avoid potential exponential backtracking in some syntax errors (GH-31241)
This commit is contained in:
parent
cb68788dca
commit
b71dc71905
|
@ -1095,13 +1095,15 @@ invalid_expression:
|
||||||
RAISE_SYNTAX_ERROR_KNOWN_RANGE(a, b, "invalid syntax. Perhaps you forgot a comma?") }
|
RAISE_SYNTAX_ERROR_KNOWN_RANGE(a, b, "invalid syntax. Perhaps you forgot a comma?") }
|
||||||
| a=disjunction 'if' b=disjunction !('else'|':') { RAISE_SYNTAX_ERROR_KNOWN_RANGE(a, b, "expected 'else' after 'if' expression") }
|
| a=disjunction 'if' b=disjunction !('else'|':') { RAISE_SYNTAX_ERROR_KNOWN_RANGE(a, b, "expected 'else' after 'if' expression") }
|
||||||
|
|
||||||
|
invalid_left_assignment_prefixes(memo): list|tuple|genexp|'True'|'None'|'False'
|
||||||
|
|
||||||
invalid_named_expression:
|
invalid_named_expression:
|
||||||
| a=expression ':=' expression {
|
| a=expression ':=' expression {
|
||||||
RAISE_SYNTAX_ERROR_KNOWN_LOCATION(
|
RAISE_SYNTAX_ERROR_KNOWN_LOCATION(
|
||||||
a, "cannot use assignment expressions with %s", _PyPegen_get_expr_name(a)) }
|
a, "cannot use assignment expressions with %s", _PyPegen_get_expr_name(a)) }
|
||||||
| a=NAME '=' b=bitwise_or !('='|':=') {
|
| a=NAME '=' b=bitwise_or !('='|':=') {
|
||||||
p->in_raw_rule ? NULL : RAISE_SYNTAX_ERROR_KNOWN_RANGE(a, b, "invalid syntax. Maybe you meant '==' or ':=' instead of '='?") }
|
p->in_raw_rule ? NULL : RAISE_SYNTAX_ERROR_KNOWN_RANGE(a, b, "invalid syntax. Maybe you meant '==' or ':=' instead of '='?") }
|
||||||
| !(list|tuple|genexp|'True'|'None'|'False') a=bitwise_or b='=' bitwise_or !('='|':=') {
|
| !invalid_left_assignment_prefixes a=bitwise_or b='=' bitwise_or !('='|':=') {
|
||||||
p->in_raw_rule ? NULL : RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "cannot assign to %s here. Maybe you meant '==' instead of '='?",
|
p->in_raw_rule ? NULL : RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "cannot assign to %s here. Maybe you meant '==' instead of '='?",
|
||||||
_PyPegen_get_expr_name(a)) }
|
_PyPegen_get_expr_name(a)) }
|
||||||
|
|
||||||
|
|
|
@ -1770,6 +1770,14 @@ while 1:
|
||||||
with self.assertRaises(MemoryError):
|
with self.assertRaises(MemoryError):
|
||||||
compile(source, "<string>", mode)
|
compile(source, "<string>", mode)
|
||||||
|
|
||||||
|
@support.cpython_only
|
||||||
|
def test_deep_invalid_rule(self):
|
||||||
|
# Check that a very deep invalid rule in the PEG
|
||||||
|
# parser doesn't have exponential backtracking.
|
||||||
|
source = "d{{{{{{{{{{{{{{{{{{{{{{{{{```{{{{{{{ef f():y"
|
||||||
|
with self.assertRaises(SyntaxError):
|
||||||
|
compile(source, "<string>", "exec")
|
||||||
|
|
||||||
|
|
||||||
def load_tests(loader, tests, pattern):
|
def load_tests(loader, tests, pattern):
|
||||||
tests.addTest(doctest.DocTestSuite())
|
tests.addTest(doctest.DocTestSuite())
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
Avoid potential exponential backtracking when producing some syntax errors
|
||||||
|
involving lots of brackets. Patch by Pablo Galindo.
|
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue