diff options
author | Batuhan Taskaya <batuhan@python.org> | 2021-06-03 20:01:02 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-06-03 20:01:02 (GMT) |
commit | f3491242e41933aa9529add7102edb68b80a25e9 (patch) | |
tree | cc4331ec55371585163e5db0291d6c17a765eca7 /Lib/test/test_ast.py | |
parent | f461a7fc3f8740b9e79e8874175115a3474e5930 (diff) | |
download | cpython-f3491242e41933aa9529add7102edb68b80a25e9.zip cpython-f3491242e41933aa9529add7102edb68b80a25e9.tar.gz cpython-f3491242e41933aa9529add7102edb68b80a25e9.tar.bz2 |
bpo-11105: Do not crash when compiling recursive ASTs (GH-20594)
When compiling an AST object with a direct / indirect reference
cycles, on the conversion phase because of exceeding amount of
calls, a segfault was raised. This patch adds recursion guards to
places for preventing user inputs to not to crash AST but instead
raise a RecursionError.
Diffstat (limited to 'Lib/test/test_ast.py')
-rw-r--r-- | Lib/test/test_ast.py | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/Lib/test/test_ast.py b/Lib/test/test_ast.py index 249e4bf..6a6f06c 100644 --- a/Lib/test/test_ast.py +++ b/Lib/test/test_ast.py @@ -1098,6 +1098,20 @@ Module( exec(code, ns) self.assertIn('sleep', ns) + def test_recursion_direct(self): + e = ast.UnaryOp(op=ast.Not(), lineno=0, col_offset=0) + e.operand = e + with self.assertRaises(RecursionError): + compile(ast.Expression(e), "<test>", "eval") + + def test_recursion_indirect(self): + e = ast.UnaryOp(op=ast.Not(), lineno=0, col_offset=0) + f = ast.UnaryOp(op=ast.Not(), lineno=0, col_offset=0) + e.operand = f + f.operand = e + with self.assertRaises(RecursionError): + compile(ast.Expression(e), "<test>", "eval") + class ASTValidatorTests(unittest.TestCase): |