From 9ba95dd027370ceda2f20761dbe558cbf9f54181 Mon Sep 17 00:00:00 2001 From: Kurt Zeilenga Date: Tue, 3 Dec 2002 01:15:03 +0000 Subject: [PATCH] ITS#2221: getaddrinfo(3) not thread-safe on some platforms (namely due to res_() routines). Change all res_() dependent routines to share same mutex. --- libraries/libldap/ldap-int.h | 2 -- libraries/libldap/os-ip.c | 14 +++++++++++++- libraries/libldap/util-int.c | 15 ++++----------- 3 files changed, 17 insertions(+), 14 deletions(-) diff --git a/libraries/libldap/ldap-int.h b/libraries/libldap/ldap-int.h index b0c2bd9361..897569b599 100644 --- a/libraries/libldap/ldap-int.h +++ b/libraries/libldap/ldap-int.h @@ -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; diff --git a/libraries/libldap/os-ip.c b/libraries/libldap/os-ip.c index 5e4391178a..4854e5c75e 100644 --- a/libraries/libldap/os-ip.c +++ b/libraries/libldap/os-ip.c @@ -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; diff --git a/libraries/libldap/util-int.c b/libraries/libldap/util-int.c index 4bf3f6fa71..649394741e 100644 --- a/libraries/libldap/util-int.c +++ b/libraries/libldap/util-int.c @@ -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 -- 2.39.5