]> git.ipfire.org Git - thirdparty/openldap.git/commitdiff
ITS#9181 Fix race on Windows mutex init
authorHoward Chu <hyc@openldap.org>
Mon, 16 Mar 2020 17:07:43 +0000 (17:07 +0000)
committerHoward Chu <hyc@openldap.org>
Mon, 16 Mar 2020 17:07:43 +0000 (17:07 +0000)
include/ldap_int_thread.h
libraries/libldap_r/thr_nt.c

index f021415934b44582a51819caae071f44321bf1f1..07fbd67e7bcf3067efbbae57a42c675c60ee33d8 100644 (file)
@@ -152,10 +152,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
index 6ff8efcab9ff3fd4f67d95941aa3bd5433cb0eab..0c1b36d95ca0589e7cb1b6332e6a9a11741f2dc0 100644 (file)
@@ -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_recursive_init( ldap_pvt_thread_mutex_t *mutex )
 {