forked from pool/openldap2
74 lines
1.8 KiB
Diff
74 lines
1.8 KiB
Diff
|
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;
|
||
|
}
|
||
|
|