Issue #23996: Avoid a crash when a delegated generator raises an unnormalized StopIteration exception. Patch by Stefan Behnel.

This commit is contained in:
Antoine Pitrou 2015-04-26 18:46:40 +02:00
parent 8c99a6d604
commit 7403e91630
2 changed files with 25 additions and 5 deletions

View file

@ -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

View file

@ -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;
}