Make PyErr_Occurred return NULL if there is no current thread. Previously it

would Py_FatalError, which called PyErr_Occurred, resulting in a semi-infinite
recursion.

Fixes issue 3605.
This commit is contained in:
Jeffrey Yasskin 2010-05-13 18:31:05 +00:00
parent f55621115c
commit 8e0bdfd1d4
3 changed files with 34 additions and 3 deletions

View file

@ -2005,6 +2005,17 @@ make_exception_with_doc(PyObject *self, PyObject *args, PyObject *kwargs)
return PyErr_NewExceptionWithDoc(name, doc, base, dict);
}
/* Test that the fatal error from not having a current thread doesn't
cause an infinite loop. Run via Lib/test/test_capi.py */
static PyObject *
crash_no_current_thread(PyObject *self)
{
Py_BEGIN_ALLOW_THREADS
PyErr_SetString(PyExc_SystemError, "bork bork bork");
Py_END_ALLOW_THREADS
return NULL;
}
static PyMethodDef TestMethods[] = {
{"raise_exception", raise_exception, METH_VARARGS},
{"raise_memoryerror", (PyCFunction)raise_memoryerror, METH_NOARGS},
@ -2069,6 +2080,7 @@ static PyMethodDef TestMethods[] = {
{"code_newempty", code_newempty, METH_VARARGS},
{"make_exception_with_doc", (PyCFunction)make_exception_with_doc,
METH_VARARGS | METH_KEYWORDS},
{"crash_no_current_thread", (PyCFunction)crash_no_current_thread, METH_NOARGS},
{NULL, NULL} /* sentinel */
};