From 3cdfdc07a9dd39bcd6855b8c104584f9c34624f2 Mon Sep 17 00:00:00 2001 From: Sam Gross Date: Fri, 8 Mar 2024 15:26:36 -0500 Subject: [PATCH] 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 --- Python/parking_lot.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) 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;