From 406b3d89e2ba94d013309884ba6fb9cb69ec5a75 Mon Sep 17 00:00:00 2001 From: Georg Brandl Date: Sat, 11 Apr 2009 21:24:37 +0000 Subject: Merged revisions 71024,71058 via svnmerge from svn+ssh://pythondev@svn.python.org/python/trunk ........ r71024 | georg.brandl | 2009-04-02 04:47:44 +0200 (Do, 02 Apr 2009) | 4 lines In PyErr_GivenExceptionMatches, temporarily bump the recursion limit, so that in the most common case PyObject_IsSubclass will not raise a recursion error we have to ignore anyway. ........ r71058 | georg.brandl | 2009-04-02 20:09:04 +0200 (Do, 02 Apr 2009) | 3 lines PyErr_NormalizeException may not set an error, so convert the PyErr_SetObject call on hitting the recursion limit into just assigning it to the arguments provided. ........ --- Misc/NEWS | 3 +++ Python/errors.c | 10 +++++++++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/Misc/NEWS b/Misc/NEWS index 9b7f13b..a08f320 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -47,6 +47,9 @@ Core and Builtins - Issue #5499: The 'c' code for argument parsing functions now only accepts a byte, and the 'C' code only accepts a unicode character. +- Fix a problem in PyErr_NormalizeException that leads to "undetected errors" + when hitting the recursion limit under certain circumstances. + - Issue #1665206: Remove the last eager import in _warnings.c and make it lazy. - Fix a segfault when running test_exceptions with coverage, caused by diff --git a/Python/errors.c b/Python/errors.c index 6335388..cccc0f7 100644 --- a/Python/errors.c +++ b/Python/errors.c @@ -279,7 +279,15 @@ finally: tstate = PyThreadState_GET(); if (++tstate->recursion_depth > Py_GetRecursionLimit()) { --tstate->recursion_depth; - PyErr_SetObject(PyExc_RuntimeError, PyExc_RecursionErrorInst); + /* throw away the old exception... */ + Py_DECREF(*exc); + Py_DECREF(*val); + /* ... and use the recursion error instead */ + *exc = PyExc_RuntimeError; + *val = PyExc_RecursionErrorInst; + Py_INCREF(*exc); + Py_INCREF(*val); + /* just keeping the old traceback */ return; } PyErr_NormalizeException(exc, val, tb); -- cgit v0.12