tags 340601 patch
thanks

Here is a patch that fixes the deadlock for me.  Fellow maintainers, is this
ok to commit to the package, or would you prefer I clean it up first so that
it's suitable for upstream submission?

-- 
Steve Langasek                   Give me a lever long enough and a Free OS
Debian Developer                   to set it on, and I can move the world.
Ubuntu Developer                                    http://www.debian.org/
[EMAIL PROTECTED]                                     [EMAIL PROTECTED]
Index: debian/patches/series
===================================================================
--- debian/patches/series	(revision 1086)
+++ debian/patches/series	(working copy)
@@ -12,3 +12,4 @@
 entryCSN-backwards-compatibility
 slapd-tlsverifyclient-default -p0
 gnutls-altname-nulterminated -p0
+getaddrinfo-is-threadsafe
Index: debian/patches/getaddrinfo-is-threadsafe
===================================================================
--- debian/patches/getaddrinfo-is-threadsafe	(revision 0)
+++ debian/patches/getaddrinfo-is-threadsafe	(revision 0)
@@ -0,0 +1,114 @@
+Author: Steve Langasek <[EMAIL PROTECTED]>
+
+OpenLDAP upstream conservatively assumes that certain resolver functions
+(getaddrinfo, getnameinfo, res_query, dn_expand) are not re-entrant; but we
+know that the glibc implementations of these functions are thread-safe, so
+we should bypass the use of this mutex.  This fixes a locking problem when
+an application uses libldap and libnss-ldap is also used for hosts
+resolution.
+
+Closes Debian bug #340601.
+
+Not suitable for forwarding upstream; might be made suitable by adding a
+configure-time check for glibc and disabling the mutex only on known
+thread-safe implementations.
+
+Index: trunk/libraries/libldap/dnssrv.c
+===================================================================
+--- trunk.orig/libraries/libldap/dnssrv.c
++++ trunk/libraries/libldap/dnssrv.c
+@@ -202,10 +202,6 @@
+     }
+     sprintf(request, "_ldap._tcp.%s", domain);
+ 
+-#ifdef LDAP_R_COMPILE
+-    ldap_pvt_thread_mutex_lock(&ldap_int_resolv_mutex);
+-#endif
+-
+     rc = LDAP_UNAVAILABLE;
+ #ifdef NS_HFIXEDSZ
+ 	/* Bind 8/9 interface */
+@@ -305,9 +301,6 @@
+ 	*list = hostlist;
+ 
+   out:
+-#ifdef LDAP_R_COMPILE
+-    ldap_pvt_thread_mutex_unlock(&ldap_int_resolv_mutex);
+-#endif
+ 
+     if (request != NULL) {
+ 	LDAP_FREE(request);
+Index: trunk/libraries/libldap/ldap-int.h
+===================================================================
+--- trunk.orig/libraries/libldap/ldap-int.h
++++ trunk/libraries/libldap/ldap-int.h
+@@ -388,7 +388,9 @@
+ #define LDAP_TRASH(ld)		( (ld)->ld_valid = LDAP_TRASHED_SESSION )
+ 
+ #ifdef LDAP_R_COMPILE
++#if !defined(HAVE_GETADDRINFO) || !defined(HAVE_GETHOSTBYADDR_R) || !defined(HAVE_GETHOSTBYNAME_R)
+ 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;
+Index: trunk/libraries/libldap/os-ip.c
+===================================================================
+--- trunk.orig/libraries/libldap/os-ip.c
++++ trunk/libraries/libldap/os-ip.c
+@@ -471,17 +471,8 @@
+ 	hints.ai_socktype = socktype;
+ 	snprintf(serv, sizeof serv, "%d", port );
+ 
+-#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);
+Index: trunk/libraries/libldap/util-int.c
+===================================================================
+--- trunk.orig/libraries/libldap/util-int.c
++++ trunk/libraries/libldap/util-int.c
+@@ -57,7 +57,9 @@
+ 
+ #else
+ # include <ldap_pvt_thread.h>
++#if !defined(HAVE_GETADDRINFO) || !defined(HAVE_GETHOSTBYADDR_R) || !defined(HAVE_GETHOSTBYNAME_R)
+   ldap_pvt_thread_mutex_t ldap_int_resolv_mutex;
++#endif
+ 
+ # if (defined( HAVE_CTIME_R ) || defined( HAVE_REENTRANT_FUNCTIONS)) \
+ 	 && defined( CTIME_R_NARGS )
+@@ -224,13 +226,7 @@
+ 	int rc;
+ #if defined( HAVE_GETNAMEINFO )
+ 
+-#if defined( LDAP_R_COMPILE )
+-	ldap_pvt_thread_mutex_lock( &ldap_int_resolv_mutex );
+-#endif
+ 	rc = getnameinfo( sa, len, name, namelen, NULL, 0, 0 );
+-#if defined( LDAP_R_COMPILE )
+-	ldap_pvt_thread_mutex_unlock( &ldap_int_resolv_mutex );
+-#endif
+ 	if ( rc ) *err = (char *)AC_GAI_STRERROR( rc );
+ 	return rc;
+ 
+@@ -406,7 +402,9 @@
+ #if !defined( USE_CTIME_R ) && !defined( HAVE_REENTRANT_FUNCTIONS )
+ 	ldap_pvt_thread_mutex_init( &ldap_int_ctime_mutex );
+ #endif
++#if !defined(HAVE_GETADDRINFO) || !defined(HAVE_GETHOSTBYADDR_R) || !defined(HAVE_GETHOSTBYNAME_R)
+ 	ldap_pvt_thread_mutex_init( &ldap_int_resolv_mutex );
++#endif
+ 
+ #ifdef HAVE_CYRUS_SASL
+ 	ldap_pvt_thread_mutex_init( &ldap_int_sasl_mutex );

Reply via email to