diff options
author | Chris Jerdonek <chris.jerdonek@gmail.com> | 2020-05-22 20:33:27 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-05-22 20:33:27 (GMT) |
commit | 7c30d12bd5359b0f66c4fbc98aa055398bcc8a7e (patch) | |
tree | 2719af29b9bd410f1ed7f70b1ab1d3c9357713e0 /Objects | |
parent | 909b5714e1303357868bc5e281c1cf508d5d5a17 (diff) | |
download | cpython-7c30d12bd5359b0f66c4fbc98aa055398bcc8a7e.zip cpython-7c30d12bd5359b0f66c4fbc98aa055398bcc8a7e.tar.gz cpython-7c30d12bd5359b0f66c4fbc98aa055398bcc8a7e.tar.bz2 |
bpo-40696: Fix a hang that can arise after gen.throw() (GH-20287)
This updates _PyErr_ChainStackItem() to use _PyErr_SetObject()
instead of _PyErr_ChainExceptions(). This prevents a hang in
certain circumstances because _PyErr_SetObject() performs checks
to prevent cycles in the exception context chain while
_PyErr_ChainExceptions() doesn't.
Diffstat (limited to 'Objects')
-rw-r--r-- | Objects/genobject.c | 10 |
1 files changed, 6 insertions, 4 deletions
diff --git a/Objects/genobject.c b/Objects/genobject.c index 271720b..09efbab 100644 --- a/Objects/genobject.c +++ b/Objects/genobject.c @@ -203,13 +203,15 @@ gen_send_ex(PyGenObject *gen, PyObject *arg, int exc, int closing) assert(f->f_back == NULL); f->f_back = tstate->frame; - if (exc) { - _PyErr_ChainStackItem(&gen->gi_exc_state); - } - gen->gi_running = 1; gen->gi_exc_state.previous_item = tstate->exc_info; tstate->exc_info = &gen->gi_exc_state; + + if (exc) { + assert(_PyErr_Occurred(tstate)); + _PyErr_ChainStackItem(NULL); + } + result = _PyEval_EvalFrame(tstate, f, exc); tstate->exc_info = gen->gi_exc_state.previous_item; gen->gi_exc_state.previous_item = NULL; |