File 0011-Fix-ldap-host-lookup-ipv6.patch of Package compat-libldap-2_3-0

The patch was written by Christian Kornacker on 2014-01-08 to fix an issue with unresponsive
LDAP host lookups in IPv6 environment.

---
 libraries/libldap/util-int.c |   43 +++++++++++++++++++++++++++++++++++++++++--
 1 file changed, 41 insertions(+), 2 deletions(-)

Index: openldap-2.3.37/libraries/libldap/util-int.c
===================================================================
--- openldap-2.3.37.orig/libraries/libldap/util-int.c
+++ openldap-2.3.37/libraries/libldap/util-int.c
@@ -527,10 +527,16 @@ static char *safe_realloc( char **buf, i
 
 char * ldap_pvt_get_fqdn( char *name )
 {
-	char *fqdn, *ha_buf;
+	int rc;
+	char *fqdn;
 	char hostbuf[MAXHOSTNAMELEN+1];
+#ifdef HAVE_GETADDRINFO
+	struct addrinfo hints, *res;
+#else
+	char *ha_buf;
 	struct hostent *hp, he_buf;
-	int rc, local_h_errno;
+	int local_h_errno;
+#endif
 
 	if( name == NULL ) {
 		if( gethostname( hostbuf, MAXHOSTNAMELEN ) == 0 ) {
@@ -541,6 +547,37 @@ char * ldap_pvt_get_fqdn( char *name )
 		}
 	}
 
+#ifdef HAVE_GETADDRINFO
+	memset( &hints, '\0', sizeof( hints ) );
+	hints.ai_family = AF_UNSPEC;
+	hints.ai_socktype = SOCK_STREAM;
+	hints.ai_flags |= AI_CANONNAME;
+
+	/* most getaddrinfo(3) use non-threadsafe resolver libraries */
+#if defined( LDAP_R_COMPILE )
+	ldap_pvt_thread_mutex_lock(&ldap_int_resolv_mutex);
+#endif
+
+	rc = getaddrinfo( name, NULL, &hints, &res );
+
+#if defined( LDAP_R_COMPILE )
+	ldap_pvt_thread_mutex_unlock(&ldap_int_resolv_mutex);
+#endif
+
+	if ( rc != 0 ) {
+		fqdn = LDAP_STRDUP( name );
+	} else {
+		while ( res ) {
+			if ( res->ai_canonname ) {
+				fqdn = LDAP_STRDUP ( res->ai_canonname );
+				break;
+			}
+			res = res->ai_next;
+		}
+		freeaddrinfo( res );
+	}
+#else
+
 	rc = ldap_pvt_gethostbyname_a( name,
 		&he_buf, &ha_buf, &hp, &local_h_errno );
 
@@ -551,6 +588,8 @@ char * ldap_pvt_get_fqdn( char *name )
 	}
 
 	LDAP_FREE( ha_buf );
+#endif
+
 	return fqdn;
 }
 
openSUSE Build Service is sponsored by