From: Batuhan Taskaya Date: Sat, 24 Jul 2021 12:50:19 +0000 (+0300) Subject: bpo-43950: ensure source_line is present when specialising the traceback (GH-27313) X-Git-Tag: v3.11.0a1~589 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=c8362314cce53a5b59da7523fbdfa00f122aa319;p=thirdparty%2FPython%2Fcpython.git bpo-43950: ensure source_line is present when specialising the traceback (GH-27313) --- diff --git a/Lib/test/test_traceback.py b/Lib/test/test_traceback.py index 4742eb1d2309..c87ce7245335 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 e02caef6f9bc..9418236abbf5 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;