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 );