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 <ericsnowcurrently@gmail.com>
This commit is contained in:
Sam Gross 2024-03-08 15:26:36 -05:00 committed by GitHub
parent 601f3a7b33
commit 3cdfdc07a9
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
1 changed files with 6 additions and 4 deletions

View File

@ -194,14 +194,16 @@ _PySemaphore_Wait(_PySemaphore *sema, PyTime_t timeout, int detach)
PyThreadState *tstate = NULL; PyThreadState *tstate = NULL;
if (detach) { if (detach) {
tstate = _PyThreadState_GET(); tstate = _PyThreadState_GET();
if (tstate) { if (tstate && tstate->state == _Py_THREAD_ATTACHED) {
// Only detach if we are attached
PyEval_ReleaseThread(tstate); PyEval_ReleaseThread(tstate);
} }
else {
tstate = NULL;
}
} }
int res = _PySemaphore_PlatformWait(sema, timeout); int res = _PySemaphore_PlatformWait(sema, timeout);
if (tstate) {
if (detach && tstate) {
PyEval_AcquireThread(tstate); PyEval_AcquireThread(tstate);
} }
return res; return res;