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