From 61bdf0e6f467ba3db46fd0035a0829aaca69a840 Mon Sep 17 00:00:00 2001 From: Howard Chu Date: Mon, 16 Mar 2020 17:07:43 +0000 Subject: [PATCH] ITS#9181 Fix race on Windows mutex init --- include/ldap_int_thread.h | 5 ++++- libraries/libldap_r/thr_nt.c | 11 +++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/include/ldap_int_thread.h b/include/ldap_int_thread.h index 54d330c122..ad94f3cd80 100644 --- a/include/ldap_int_thread.h +++ b/include/ldap_int_thread.h @@ -180,10 +180,13 @@ typedef HANDLE ldap_int_thread_mutex_t; typedef HANDLE ldap_int_thread_cond_t; typedef DWORD ldap_int_thread_key_t; +LDAP_F( int ) +ldap_pvt_thread_mutex_init_first LDAP_P(( ldap_pvt_thread_mutex_t *mutex )); + #ifndef LDAP_INT_MUTEX_NULL #define LDAP_INT_MUTEX_NULL ((HANDLE)0) #define LDAP_INT_MUTEX_FIRSTCREATE(m) \ - ((void) ((m) || ldap_pvt_thread_mutex_init(&(m)))) + ldap_pvt_thread_mutex_init_first(&(m)) #endif LDAP_END_DECL diff --git a/libraries/libldap_r/thr_nt.c b/libraries/libldap_r/thr_nt.c index 19a0549bd8..5929556b8f 100644 --- a/libraries/libldap_r/thr_nt.c +++ b/libraries/libldap_r/thr_nt.c @@ -161,6 +161,17 @@ ldap_pvt_thread_mutex_init( ldap_pvt_thread_mutex_t *mutex ) return ( 0 ); } +int +ldap_pvt_thread_mutex_init_first( ldap_pvt_thread_mutex_t *mutex ) +{ + if ( *mutex == NULL ) { + HANDLE p = CreateMutex( NULL, 0, NULL ); + if ( InterlockedCompareExchangePointer((PVOID*)mutex, (PVOID)p, NULL) != NULL) + CloseHandle( p ); + } + return ( 0 ); +} + int ldap_pvt_thread_mutex_destroy( ldap_pvt_thread_mutex_t *mutex ) { -- 2.47.2