summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGeorg Brandl <georg@python.org>2009-04-02 18:09:04 (GMT)
committerGeorg Brandl <georg@python.org>2009-04-02 18:09:04 (GMT)
commitd3f03fa715f9f82ab512a444f8452ac5e5c87d3a (patch)
tree7adb6e88b1c29c316ede5f00ee91ca5187e54fb1
parentdd98e04c5737554ebf6a3fe4ff0be304e8ec537a (diff)
downloadcpython-d3f03fa715f9f82ab512a444f8452ac5e5c87d3a.zip
cpython-d3f03fa715f9f82ab512a444f8452ac5e5c87d3a.tar.gz
cpython-d3f03fa715f9f82ab512a444f8452ac5e5c87d3a.tar.bz2
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.
-rw-r--r--Misc/NEWS3
-rw-r--r--Python/errors.c10
2 files changed, 12 insertions, 1 deletions
diff --git a/Misc/NEWS b/Misc/NEWS
index 196f5a9..a331bd7 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -12,6 +12,9 @@ What's New in Python 2.7 alpha 1
Core and Builtins
-----------------
+- 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.
- Issue #4865: On MacOSX /Library/Python/2.7/site-packages is added to
diff --git a/Python/errors.c b/Python/errors.c
index 02e9572..e0ff90f 100644
--- a/Python/errors.c
+++ b/Python/errors.c
@@ -225,7 +225,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);