closes bpo-39091: Fix segfault when Exception constructor returns non-exception for gen.throw. (#17658)

Co-authored-by: Benjamin Peterson <benjamin@python.org>
This commit is contained in:
Noah 2021-08-02 21:17:18 -05:00 committed by GitHub
parent 54f185b6d3
commit 83ca46b778
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 44 additions and 4 deletions

View file

@ -85,17 +85,29 @@ _PyErr_GetTopmostException(PyThreadState *tstate)
}
static PyObject*
_PyErr_CreateException(PyObject *exception, PyObject *value)
_PyErr_CreateException(PyObject *exception_type, PyObject *value)
{
PyObject *exc;
if (value == NULL || value == Py_None) {
return _PyObject_CallNoArg(exception);
exc = _PyObject_CallNoArg(exception_type);
}
else if (PyTuple_Check(value)) {
return PyObject_Call(exception, value, NULL);
exc = PyObject_Call(exception_type, value, NULL);
}
else {
return PyObject_CallOneArg(exception, value);
exc = PyObject_CallOneArg(exception_type, value);
}
if (exc != NULL && !PyExceptionInstance_Check(exc)) {
PyErr_Format(PyExc_TypeError,
"calling %R should have returned an instance of "
"BaseException, not %s",
exception_type, Py_TYPE(exc)->tp_name);
Py_CLEAR(exc);
}
return exc;
}
void