Commit 9ba95dd0 authored by Kurt Zeilenga's avatar Kurt Zeilenga
Browse files

ITS#2221: getaddrinfo(3) not thread-safe on some platforms (namely

due to res_() routines).  Change all res_() dependent routines to
share same mutex.
parent 416aeb93
......@@ -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;
......
......@@ -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;
......
......@@ -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
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment