diff options
author | Georg Brandl <georg@python.org> | 2009-04-02 18:09:04 (GMT) |
---|---|---|
committer | Georg Brandl <georg@python.org> | 2009-04-02 18:09:04 (GMT) |
commit | d3f03fa715f9f82ab512a444f8452ac5e5c87d3a (patch) | |
tree | 7adb6e88b1c29c316ede5f00ee91ca5187e54fb1 | |
parent | dd98e04c5737554ebf6a3fe4ff0be304e8ec537a (diff) | |
download | cpython-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/NEWS | 3 | ||||
-rw-r--r-- | Python/errors.c | 10 |
2 files changed, 12 insertions, 1 deletions
@@ -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); |