From: Howard Chu Date: Mon, 16 Mar 2020 17:07:43 +0000 (+0000) Subject: ITS#9181 Fix race on Windows mutex init X-Git-Tag: OPENLDAP_REL_ENG_2_4_50~31 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=61bdf0e6f467ba3db46fd0035a0829aaca69a840;p=thirdparty%2Fopenldap.git ITS#9181 Fix race on Windows mutex init --- 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 ) {