bpo-39877: Fix take_gil() for daemon threads (GH-19054)

bpo-39877, bpo-39984: If the thread must exit, don't access tstate to
prevent a potential crash: tstate memory has been freed.
This commit is contained in:
Victor Stinner 2020-03-18 03:04:33 +01:00 committed by GitHub
parent 23ef89db7a
commit 29356e03d4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 6 additions and 2 deletions

View File

@ -281,13 +281,17 @@ _ready:
if (_Py_atomic_load_relaxed(&ceval->gil_drop_request)) {
RESET_GIL_DROP_REQUEST(ceval);
}
if (tstate->async_exc != NULL) {
int must_exit = tstate_must_exit(tstate);
/* Don't access tstate if the thread must exit */
if (!must_exit && tstate->async_exc != NULL) {
_PyEval_SignalAsyncExc(ceval);
}
MUTEX_UNLOCK(gil->mutex);
if (tstate_must_exit(tstate)) {
if (must_exit) {
/* bpo-36475: If Py_Finalize() has been called and tstate is not
the thread which called Py_Finalize(), exit immediately the
thread.