[Python-checkins] bpo-39877: Fix take_gil() for daemon threads (GH-19054)

Victor Stinner webhook-mailer at python.org
Tue Mar 17 22:04:40 EDT 2020


https://github.com/python/cpython/commit/29356e03d4f8800b04f799efe7a10e3ce8b16f61
commit: 29356e03d4f8800b04f799efe7a10e3ce8b16f61
branch: master
author: Victor Stinner <vstinner at python.org>
committer: GitHub <noreply at github.com>
date: 2020-03-18T03:04:33+01:00
summary:

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.

files:
M Python/ceval_gil.h

diff --git a/Python/ceval_gil.h b/Python/ceval_gil.h
index 9c051ae57b03b..f8b06ac68c914 100644
--- a/Python/ceval_gil.h
+++ b/Python/ceval_gil.h
@@ -281,13 +281,17 @@ take_gil(PyThreadState *tstate)
     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.



More information about the Python-checkins mailing list