diff --git a/libraries/libldap/init.c b/libraries/libldap/init.c index 375d02bc0ebe8e6d380aa0f7920cd84583f4a020..e08e5d06dbd94a73255ee1e78f3caebf6c7b9548 100644 --- a/libraries/libldap/init.c +++ b/libraries/libldap/init.c @@ -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 ); }