mirror of https://github.com/python/cpython
Issue #23996: Avoid a crash when a delegated generator raises an unnormalized StopIteration exception. Patch by Stefan Behnel.
This commit is contained in:
parent
8c99a6d604
commit
7403e91630
|
@ -10,6 +10,9 @@ Release date: tba
|
|||
Core and Builtins
|
||||
-----------------
|
||||
|
||||
- Issue #23996: Avoid a crash when a delegated generator raises an
|
||||
unnormalized StopIteration exception. Patch by Stefan Behnel.
|
||||
|
||||
- Issue #24022: Fix tokenizer crash when processing undecodable source code.
|
||||
|
||||
- Issue #23309: Avoid a deadlock at shutdown if a daemon thread is aborted
|
||||
|
|
|
@ -396,13 +396,30 @@ _PyGen_FetchStopIterationValue(PyObject **pvalue) {
|
|||
|
||||
if (PyErr_ExceptionMatches(PyExc_StopIteration)) {
|
||||
PyErr_Fetch(&et, &ev, &tb);
|
||||
if (ev) {
|
||||
/* exception will usually be normalised already */
|
||||
if (Py_TYPE(ev) == (PyTypeObject *) et
|
||||
|| PyObject_IsInstance(ev, PyExc_StopIteration)) {
|
||||
value = ((PyStopIterationObject *)ev)->value;
|
||||
Py_INCREF(value);
|
||||
Py_DECREF(ev);
|
||||
} else if (et == PyExc_StopIteration) {
|
||||
/* avoid normalisation and take ev as value */
|
||||
value = ev;
|
||||
} else {
|
||||
/* normalisation required */
|
||||
PyErr_NormalizeException(&et, &ev, &tb);
|
||||
if (!PyObject_IsInstance(ev, PyExc_StopIteration)) {
|
||||
PyErr_Restore(et, ev, tb);
|
||||
return -1;
|
||||
}
|
||||
value = ((PyStopIterationObject *)ev)->value;
|
||||
Py_INCREF(value);
|
||||
Py_DECREF(ev);
|
||||
}
|
||||
}
|
||||
Py_XDECREF(et);
|
||||
Py_XDECREF(tb);
|
||||
if (ev) {
|
||||
value = ((PyStopIterationObject *)ev)->value;
|
||||
Py_INCREF(value);
|
||||
Py_DECREF(ev);
|
||||
}
|
||||
} else if (PyErr_Occurred()) {
|
||||
return -1;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue