]> git.ipfire.org Git - thirdparty/openldap.git/commitdiff
ITS#7996 Tighten race in ldap_int_initialize
authorOndřej Kuzník <ondra@mistotebe.net>
Tue, 11 Jun 2019 16:30:28 +0000 (18:30 +0200)
committerQuanah Gibson-Mount <quanah@openldap.org>
Thu, 13 Jun 2019 18:26:08 +0000 (18:26 +0000)
libraries/libldap/init.c

index 375d02bc0ebe8e6d380aa0f7920cd84583f4a020..e08e5d06dbd94a73255ee1e78f3caebf6c7b9548 100644 (file)
@@ -516,15 +516,6 @@ ldap_int_destroy_global_options(void)
  */
 void ldap_int_initialize_global_options( struct ldapoptions *gopts, int *dbglvl )
 {
-#ifdef LDAP_R_COMPILE
-       LDAP_PVT_MUTEX_FIRSTCREATE(gopts->ldo_mutex);
-#endif
-       LDAP_MUTEX_LOCK( &gopts->ldo_mutex );
-       if (gopts->ldo_valid == LDAP_INITIALIZED) {
-               /* someone else got here first */
-               LDAP_MUTEX_UNLOCK( &gopts->ldo_mutex );
-               return;
-       }
        if (dbglvl)
            gopts->ldo_debug = *dbglvl;
        else
@@ -588,7 +579,6 @@ void ldap_int_initialize_global_options( struct ldapoptions *gopts, int *dbglvl
        gopts->ldo_keepalive_idle = 0;
 
        gopts->ldo_valid = LDAP_INITIALIZED;
-       LDAP_MUTEX_UNLOCK( &gopts->ldo_mutex );
        return;
 }
 
@@ -598,7 +588,14 @@ char * ldap_int_hostname = NULL;
 
 void ldap_int_initialize( struct ldapoptions *gopts, int *dbglvl )
 {
+#ifdef LDAP_R_COMPILE
+       LDAP_PVT_MUTEX_FIRSTCREATE( gopts->ldo_mutex );
+#endif
+
+       LDAP_MUTEX_LOCK( &gopts->ldo_mutex );
        if ( gopts->ldo_valid == LDAP_INITIALIZED ) {
+               /* someone else got here first */
+               LDAP_MUTEX_UNLOCK( &gopts->ldo_mutex );
                return;
        }
 
@@ -614,7 +611,7 @@ void ldap_int_initialize( struct ldapoptions *gopts, int *dbglvl )
        if ( WSAStartup( wVersionRequested, &wsaData ) != 0 ) {
                /* Tell the user that we couldn't find a usable */
                /* WinSock DLL.                                  */
-               return;
+               goto done;
        }
  
        /* Confirm that the WinSock DLL supports 2.0.*/
@@ -629,13 +626,13 @@ void ldap_int_initialize( struct ldapoptions *gopts, int *dbglvl )
            /* Tell the user that we couldn't find a usable */
            /* WinSock DLL.                                  */
            WSACleanup( );
-           return; 
+           goto done;
        }
 }      /* The WinSock DLL is acceptable. Proceed. */
 #elif defined(HAVE_WINSOCK)
 {      WSADATA wsaData;
        if ( WSAStartup( 0x0101, &wsaData ) != 0 ) {
-           return;
+           goto done;
        }
 }
 #endif
@@ -660,14 +657,14 @@ void ldap_int_initialize( struct ldapoptions *gopts, int *dbglvl )
 
 #ifdef HAVE_CYRUS_SASL
        if ( ldap_int_sasl_init() != 0 ) {
-               return;
+               goto done;
        }
 #endif
 
        ldap_int_initialize_global_options(gopts, dbglvl);
 
        if( getenv("LDAPNOINIT") != NULL ) {
-               return;
+               goto done;
        }
 
 #ifdef HAVE_CYRUS_SASL
@@ -688,7 +685,7 @@ void ldap_int_initialize( struct ldapoptions *gopts, int *dbglvl )
 
 #ifdef HAVE_GETEUID
        if ( geteuid() != getuid() )
-               return;
+               goto done;
 #endif
 
        openldap_ldap_init_w_userconf(LDAP_USERRC_FILE);
@@ -720,4 +717,7 @@ void ldap_int_initialize( struct ldapoptions *gopts, int *dbglvl )
        }
 
        openldap_ldap_init_w_env(gopts, NULL);
+
+done:
+       LDAP_MUTEX_UNLOCK( &gopts->ldo_mutex );
 }