Issue #23996: Avoid a crash when a delegated generator raises an unnormalized StopIteration exception.  Patch by Stefan Behnel.
diff --git a/Objects/genobject.c b/Objects/genobject.c
index 08d30bf..f125847 100644
--- a/Objects/genobject.c
+++ b/Objects/genobject.c
@@ -396,13 +396,30 @@
 
     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;
     }