mirror of
https://github.com/python/cpython.git
synced 2025-09-22 00:12:56 +00:00
bpo-45826: Fix a crash in suggestions.c by checking for traceback is None
(GH-29590)
This commit is contained in:
parent
736684b1bb
commit
5d90c467c0
3 changed files with 43 additions and 3 deletions
|
@ -1885,6 +1885,37 @@ class NameErrorTests(unittest.TestCase):
|
||||||
|
|
||||||
self.assertNotIn("something", err.getvalue())
|
self.assertNotIn("something", err.getvalue())
|
||||||
|
|
||||||
|
def test_issue45826(self):
|
||||||
|
# regression test for bpo-45826
|
||||||
|
def f():
|
||||||
|
with self.assertRaisesRegex(NameError, 'aaa'):
|
||||||
|
aab
|
||||||
|
|
||||||
|
try:
|
||||||
|
f()
|
||||||
|
except self.failureException:
|
||||||
|
with support.captured_stderr() as err:
|
||||||
|
sys.__excepthook__(*sys.exc_info())
|
||||||
|
|
||||||
|
self.assertIn("aab", err.getvalue())
|
||||||
|
|
||||||
|
def test_issue45826_focused(self):
|
||||||
|
def f():
|
||||||
|
try:
|
||||||
|
nonsense
|
||||||
|
except BaseException as E:
|
||||||
|
E.with_traceback(None)
|
||||||
|
raise ZeroDivisionError()
|
||||||
|
|
||||||
|
try:
|
||||||
|
f()
|
||||||
|
except ZeroDivisionError:
|
||||||
|
with support.captured_stderr() as err:
|
||||||
|
sys.__excepthook__(*sys.exc_info())
|
||||||
|
|
||||||
|
self.assertIn("nonsense", err.getvalue())
|
||||||
|
self.assertIn("ZeroDivisionError", err.getvalue())
|
||||||
|
|
||||||
|
|
||||||
class AttributeErrorTests(unittest.TestCase):
|
class AttributeErrorTests(unittest.TestCase):
|
||||||
def test_attributes(self):
|
def test_attributes(self):
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
Fixed a crash when calling ``.with_traceback(None)`` on ``NameError``. This occurs internally in ``unittest.TestCase.assertRaises()``.
|
|
@ -202,13 +202,21 @@ offer_suggestions_for_name_error(PyNameErrorObject *exc)
|
||||||
PyTracebackObject *traceback = (PyTracebackObject *) exc->traceback; // borrowed reference
|
PyTracebackObject *traceback = (PyTracebackObject *) exc->traceback; // borrowed reference
|
||||||
// Abort if we don't have a variable name or we have an invalid one
|
// Abort if we don't have a variable name or we have an invalid one
|
||||||
// or if we don't have a traceback to work with
|
// or if we don't have a traceback to work with
|
||||||
if (name == NULL || traceback == NULL || !PyUnicode_CheckExact(name)) {
|
if (name == NULL || !PyUnicode_CheckExact(name) ||
|
||||||
|
traceback == NULL || !Py_IS_TYPE(traceback, &PyTraceBack_Type)
|
||||||
|
) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Move to the traceback of the exception
|
// Move to the traceback of the exception
|
||||||
while (traceback->tb_next != NULL) {
|
while (1) {
|
||||||
traceback = traceback->tb_next;
|
PyTracebackObject *next = traceback->tb_next;
|
||||||
|
if (next == NULL || !Py_IS_TYPE(next, &PyTraceBack_Type)) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
traceback = next;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
PyFrameObject *frame = traceback->tb_frame;
|
PyFrameObject *frame = traceback->tb_frame;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue