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 | 39 +++++++++++++++++++++++++++++++++++++-- 1 file changed, 37 insertions(+), 2 deletions(-) Index: openldap-2.4.41/libraries/libldap/util-int.c =================================================================== --- openldap-2.4.41.orig/libraries/libldap/util-int.c +++ openldap-2.4.41/libraries/libldap/util-int.c @@ -731,10 +731,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 ) { @@ -745,6 +751,33 @@ 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 */ + LDAP_MUTEX_LOCK(&ldap_int_resolv_mutex); + + rc = getaddrinfo( name, NULL, &hints, &res ); + + LDAP_MUTEX_UNLOCK(&ldap_int_resolv_mutex); + + 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 ); @@ -755,6 +788,8 @@ char * ldap_pvt_get_fqdn( char *name ) } LDAP_FREE( ha_buf ); +#endif + return fqdn; }