https://sourceware.org/git/gitweb.cgi?p=newlib-cygwin.git;h=2c5433e5da8216aaf7458e50c63683c68fb0d3e8
commit 2c5433e5da8216aaf7458e50c63683c68fb0d3e8 Author: Takashi Yano <[email protected]> Date: Wed Jan 24 22:33:12 2024 +0900 Cygwin: pthread: Fix handle leak in pthread_once. If pthread_once() is called with pthread_once_t initialized using PTREAD_ONCE_INIT, pthread_once does not release pthread_mutex used internally. This patch fixes that by calling pthread_mutex_destroy() in the thread which has called init_routine. Reviewed-by: Corinna Vinschen <[email protected]> Signed-off-by: Takashi Yano <[email protected]> Diff: --- winsup/cygwin/thread.cc | 3 +++ 1 file changed, 3 insertions(+) diff --git a/winsup/cygwin/thread.cc b/winsup/cygwin/thread.cc index 7bb4f9fc8..0f8327831 100644 --- a/winsup/cygwin/thread.cc +++ b/winsup/cygwin/thread.cc @@ -2060,6 +2060,9 @@ pthread::once (pthread_once_t *once_control, void (*init_routine) (void)) { init_routine (); once_control->state = 1; + pthread_mutex_unlock (&once_control->mutex); + while (pthread_mutex_destroy (&once_control->mutex) == EBUSY); + return 0; } /* Here we must remove our cancellation handler */ pthread_mutex_unlock (&once_control->mutex);
