]> git.sur5r.net Git - openldap/commitdiff
ITS#2221: getaddrinfo(3) not thread-safe on some platforms (namely
authorKurt Zeilenga <kurt@openldap.org>
Tue, 3 Dec 2002 01:15:03 +0000 (01:15 +0000)
committerKurt Zeilenga <kurt@openldap.org>
Tue, 3 Dec 2002 01:15:03 +0000 (01:15 +0000)
due to res_() routines).  Change all res_() dependent routines to
share same mutex.

libraries/libldap/ldap-int.h
libraries/libldap/os-ip.c
libraries/libldap/util-int.c

index b0c2bd93614cfe0bdbe4c161d74212f5a16be2c6..897569b59980b3453a286cde634f0cf9015dc579 100644 (file)
@@ -315,9 +315,7 @@ struct ldap {
 #define LDAP_VALID(ld) ( (ld)->ld_valid == LDAP_VALID_SESSION )
 
 #ifdef LDAP_R_COMPILE
-#ifdef HAVE_RES_QUERY
 LDAP_V ( ldap_pvt_thread_mutex_t ) ldap_int_resolv_mutex;
-#endif
 
 #ifdef HAVE_CYRUS_SASL
 LDAP_V( ldap_pvt_thread_mutex_t ) ldap_int_sasl_mutex;
index 5e4391178a735f74eecbd35d969ee034c4fe966d..4854e5c75e640c4ea7ef530d8514165cb91e702e 100644 (file)
@@ -357,7 +357,19 @@ ldap_connect_to_host(LDAP *ld, Sockbuf *sb,
                hints.ai_socktype = socktype;
 
                snprintf(serv, sizeof serv, "%d", port );
-               if ( ( err = getaddrinfo(host, serv, &hints, &res) ) ) {
+
+#ifdef LDAP_R_COMPILE
+               /* most getaddrinfo(3) use non-threadsafe resolver libraries */
+               ldap_pvt_thread_mutex_lock(&ldap_int_resolv_mutex);
+#endif
+
+               err = getaddrinfo( host, serv, &hints, &res );
+
+#ifdef LDAP_R_COMPILE
+               ldap_pvt_thread_mutex_unlock(&ldap_int_resolv_mutex);
+#endif
+
+               if ( err != 0 ) {
                        osip_debug(ld, "ldap_connect_to_host: getaddrinfo failed: %s\n",
                                AC_GAI_STRERROR(err), 0, 0);
                        return -1;
index 4bf3f6fa71e6833f56f0060737fed7dfdbbf8b0b..649394741eb53ce14cfb7c729062ff4894793596 100644 (file)
@@ -59,9 +59,6 @@
 # ifndef USE_CTIME_R
        static ldap_pvt_thread_mutex_t ldap_int_ctime_mutex;
 # endif
-# if !defined( HAVE_GETHOSTBYNAME_R ) || !defined( HAVE_GETHOSTBYADDR_R )
-       static ldap_pvt_thread_mutex_t ldap_int_gethostby_mutex;
-# endif
 # ifdef HAVE_RES_QUERY
        ldap_pvt_thread_mutex_t ldap_int_resolv_mutex;
 # endif
@@ -148,7 +145,7 @@ int ldap_pvt_gethostbyname_a(
        int     retval;
        *buf = NULL;
        
-       ldap_pvt_thread_mutex_lock( &ldap_int_gethostby_mutex );
+       ldap_pvt_thread_mutex_lock( &ldap_int_resolv_mutex );
        
        he = gethostbyname( name );
        
@@ -163,7 +160,7 @@ int ldap_pvt_gethostbyname_a(
                retval = 0;
        }
        
-       ldap_pvt_thread_mutex_unlock( &ldap_int_gethostby_mutex );
+       ldap_pvt_thread_mutex_unlock( &ldap_int_resolv_mutex );
        
        return retval;
 #else  
@@ -229,7 +226,7 @@ int ldap_pvt_gethostbyaddr_a(
        int     retval;
        *buf = NULL;   
        
-       ldap_pvt_thread_mutex_lock( &ldap_int_gethostby_mutex );
+       ldap_pvt_thread_mutex_lock( &ldap_int_resolv_mutex );
        
        he = gethostbyaddr( addr, len, type );
        
@@ -244,7 +241,7 @@ int ldap_pvt_gethostbyaddr_a(
                retval = 0;
        }
        
-       ldap_pvt_thread_mutex_unlock( &ldap_int_gethostby_mutex );
+       ldap_pvt_thread_mutex_unlock( &ldap_int_resolv_mutex );
        
        return retval;   
 #else /* gethostbyaddr() */
@@ -274,10 +271,6 @@ void ldap_int_utils_init( void )
        ldap_pvt_thread_mutex_init( &ldap_int_ctime_mutex );
 #endif
 
-#if !defined( HAVE_GETHOSTBYNAME_R ) || !defined( HAVE_GETHOSTBYADDR_R )
-       ldap_pvt_thread_mutex_init( &ldap_int_gethostby_mutex );
-#endif
-
 #ifdef HAVE_RES_QUERY
        ldap_pvt_thread_mutex_init( &ldap_int_resolv_mutex );
 #endif