Not protecting the accesses to ldap_int_hostname could lead to a double
free.
#if defined(HAVE_TLS) || defined(HAVE_CYRUS_SASL)
{
+ LDAP_MUTEX_LOCK( &ldap_int_hostname_mutex );
char *name = ldap_int_hostname;
ldap_int_hostname = ldap_pvt_get_fqdn( name );
if ( name != NULL && name != ldap_int_hostname ) {
LDAP_FREE( name );
}
+ LDAP_MUTEX_UNLOCK( &ldap_int_hostname_mutex );
}
#endif
#ifdef LDAP_R_COMPILE
LDAP_V ( ldap_pvt_thread_mutex_t ) ldap_int_resolv_mutex;
+LDAP_V ( ldap_pvt_thread_mutex_t ) ldap_int_hostname_mutex;
#ifdef HAVE_CYRUS_SASL
LDAP_V( ldap_pvt_thread_mutex_t ) ldap_int_sasl_mutex;
#else
# include <ldap_pvt_thread.h>
ldap_pvt_thread_mutex_t ldap_int_resolv_mutex;
+ ldap_pvt_thread_mutex_t ldap_int_hostname_mutex;
# if (defined( HAVE_CTIME_R ) || defined( HAVE_REENTRANT_FUNCTIONS)) \
&& defined( CTIME_R_NARGS )
#endif
ldap_pvt_thread_mutex_init( &ldap_int_resolv_mutex );
+ ldap_pvt_thread_mutex_init( &ldap_int_hostname_mutex );
+
#ifdef HAVE_CYRUS_SASL
ldap_pvt_thread_mutex_init( &ldap_int_sasl_mutex );
#endif