From a4f0fc9941adcdab8a414eef05fecfa561097d8e Mon Sep 17 00:00:00 2001 From: Frederik Deweerdt <frederik.deweerdt@gmail.com> Date: Fri, 11 May 2012 14:05:21 -0700 Subject: [PATCH] ITS#7270 Protect accesses to ldap_int_hostname with a mutex. Not protecting the accesses to ldap_int_hostname could lead to a double free. --- libraries/libldap/init.c | 2 ++ libraries/libldap/ldap-int.h | 1 + libraries/libldap/util-int.c | 3 +++ 3 files changed, 6 insertions(+) diff --git a/libraries/libldap/init.c b/libraries/libldap/init.c index 48e0e08b81..7ac377d656 100644 --- a/libraries/libldap/init.c +++ b/libraries/libldap/init.c @@ -636,6 +636,7 @@ void ldap_int_initialize( struct ldapoptions *gopts, int *dbglvl ) #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 ); @@ -643,6 +644,7 @@ void ldap_int_initialize( struct ldapoptions *gopts, int *dbglvl ) if ( name != NULL && name != ldap_int_hostname ) { LDAP_FREE( name ); } + LDAP_MUTEX_UNLOCK( &ldap_int_hostname_mutex ); } #endif diff --git a/libraries/libldap/ldap-int.h b/libraries/libldap/ldap-int.h index 1ef15ad215..7aca22236d 100644 --- a/libraries/libldap/ldap-int.h +++ b/libraries/libldap/ldap-int.h @@ -482,6 +482,7 @@ struct ldap { #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; diff --git a/libraries/libldap/util-int.c b/libraries/libldap/util-int.c index 85f13fcedd..f451cc541c 100644 --- a/libraries/libldap/util-int.c +++ b/libraries/libldap/util-int.c @@ -58,6 +58,7 @@ extern int h_errno; #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 ) @@ -603,6 +604,8 @@ void ldap_int_utils_init( void ) #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 -- GitLab