summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBatuhan Taskaya <batuhan@python.org>2021-07-24 15:50:19 +0300
committerGitHub <noreply@github.com>2021-07-24 13:50:19 +0100
commitc8362314cce53a5b59da7523fbdfa00f122aa319 (patch)
tree5d2df73bd5b7ac436b1fbb15242e4bed12ce5476
parenta22b05da87bdfb081d6aaecfce136ae8dbb8680c (diff)
downloadcpython-git-c8362314cce53a5b59da7523fbdfa00f122aa319.tar.gz
bpo-43950: ensure source_line is present when specialising the traceback (GH-27313)
-rw-r--r--Lib/test/test_traceback.py25
-rw-r--r--Python/traceback.c4
2 files changed, 27 insertions, 2 deletions
diff --git a/Lib/test/test_traceback.py b/Lib/test/test_traceback.py
index 4742eb1d23..c87ce72453 100644
--- a/Lib/test/test_traceback.py
+++ b/Lib/test/test_traceback.py
@@ -121,6 +121,31 @@ class TracebackCases(unittest.TestCase):
finally:
unlink(TESTFN)
+ def test_recursion_error_during_traceback(self):
+ code = textwrap.dedent("""
+ import sys
+ from weakref import ref
+
+ sys.setrecursionlimit(15)
+
+ def f():
+ ref(lambda: 0, [])
+ f()
+
+ try:
+ f()
+ except RecursionError:
+ pass
+ """)
+ try:
+ with open(TESTFN, 'w') as f:
+ f.write(code)
+
+ rc, _, _ = assert_python_ok(TESTFN)
+ self.assertEqual(rc, 0)
+ finally:
+ unlink(TESTFN)
+
def test_bad_indentation(self):
err = self.get_exception_format(self.syntax_error_bad_indentation,
IndentationError)
diff --git a/Python/traceback.c b/Python/traceback.c
index e02caef6f9..9418236abb 100644
--- a/Python/traceback.c
+++ b/Python/traceback.c
@@ -699,11 +699,11 @@ tb_displayline(PyTracebackObject* tb, PyObject *f, PyObject *filename, int linen
Py_DECREF(line);
if (err != 0)
return err;
+
int truncation = _TRACEBACK_SOURCE_LINE_INDENT;
PyObject* source_line = NULL;
-
if (_Py_DisplaySourceLine(f, filename, lineno, _TRACEBACK_SOURCE_LINE_INDENT,
- &truncation, &source_line) != 0) {
+ &truncation, &source_line) != 0 || !source_line) {
/* ignore errors since we can't report them, can we? */
err = ignore_source_errors();
goto done;