https://github.com/python/cpython/commit/3cdfdc07a9dd39bcd6855b8c104584f9c34624f2
commit: 3cdfdc07a9dd39bcd6855b8c104584f9c34624f2
branch: main
author: Sam Gross <[email protected]>
committer: colesbury <[email protected]>
date: 2024-03-08T15:26:36-05:00
summary:

gh-108724: Fix _PySemaphore_Wait call during thread deletion (#116483)

In general, when `_PyThreadState_GET()` is non-NULL then the current
thread is "attached", but there is a small window during
`PyThreadState_DeleteCurrent()` where that's not true:
tstate_delete_common() is called when the thread is detached, but before
current_fast_clear().

Co-authored-by: Eric Snow <[email protected]>

files:
M Python/parking_lot.c

diff --git a/Python/parking_lot.c b/Python/parking_lot.c
index 0a897f9952f648..d5877fef56e4d0 100644
--- a/Python/parking_lot.c
+++ b/Python/parking_lot.c
@@ -194,14 +194,16 @@ _PySemaphore_Wait(_PySemaphore *sema, PyTime_t timeout, 
int detach)
     PyThreadState *tstate = NULL;
     if (detach) {
         tstate = _PyThreadState_GET();
-        if (tstate) {
+        if (tstate && tstate->state == _Py_THREAD_ATTACHED) {
+            // Only detach if we are attached
             PyEval_ReleaseThread(tstate);
         }
+        else {
+            tstate = NULL;
+        }
     }
-
     int res = _PySemaphore_PlatformWait(sema, timeout);
-
-    if (detach && tstate) {
+    if (tstate) {
         PyEval_AcquireThread(tstate);
     }
     return res;

_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3/lists/python-checkins.python.org/
Member address: [email protected]

Reply via email to