summaryrefslogtreecommitdiffstats
path: root/Objects
diff options
context:
space:
mode:
authorVictor Stinner <victor.stinner@gmail.com>2013-12-13 01:37:09 (GMT)
committerVictor Stinner <victor.stinner@gmail.com>2013-12-13 01:37:09 (GMT)
commit66c6e9dcb4cea8cce36abbd95308aa15b3381bea (patch)
tree13f28d6fb2166c73a010000883647613d56819e3 /Objects
parent9ffb1481d8103407d3d09d212993ab7c36c58087 (diff)
downloadcpython-66c6e9dcb4cea8cce36abbd95308aa15b3381bea.zip
cpython-66c6e9dcb4cea8cce36abbd95308aa15b3381bea.tar.gz
cpython-66c6e9dcb4cea8cce36abbd95308aa15b3381bea.tar.bz2
Issue #14432: Generator now clears the borrowed reference to the thread state
Fix a crash when a generator is created in a C thread that is destroyed while the generator is still used. The issue was that a generator contains a frame, and the frame kept a reference to the Python state of the destroyed C thread. The crash occurs when a trace function is setup.
Diffstat (limited to 'Objects')
-rw-r--r--Objects/genobject.c3
1 files changed, 3 insertions, 0 deletions
diff --git a/Objects/genobject.c b/Objects/genobject.c
index 341f660..082e03c 100644
--- a/Objects/genobject.c
+++ b/Objects/genobject.c
@@ -76,6 +76,7 @@ gen_send_ex(PyGenObject *gen, PyObject *arg, int exc)
/* Generators always return to their most recent caller, not
* necessarily their creator. */
+ f->f_tstate = tstate;
Py_XINCREF(tstate->frame);
assert(f->f_back == NULL);
f->f_back = tstate->frame;
@@ -89,6 +90,8 @@ gen_send_ex(PyGenObject *gen, PyObject *arg, int exc)
* cycle. */
assert(f->f_back == tstate->frame);
Py_CLEAR(f->f_back);
+ /* Clear the borrowed reference to the thread state */
+ f->f_tstate = NULL;
/* If the generator just returned (as opposed to yielding), signal
* that the generator is exhausted. */