From c8362314cce53a5b59da7523fbdfa00f122aa319 Mon Sep 17 00:00:00 2001 From: Batuhan Taskaya Date: Sat, 24 Jul 2021 15:50:19 +0300 Subject: bpo-43950: ensure source_line is present when specialising the traceback (GH-27313) --- Lib/test/test_traceback.py | 25 +++++++++++++++++++++++++ Python/traceback.c | 4 ++-- 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/Lib/test/test_traceback.py b/Lib/test/test_traceback.py index 4742eb1..c87ce72 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 e02caef..9418236 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; -- cgit v0.12