File slapd_getaddrinfo_dupl.dif of Package openldap2

Index: openldap-2.4.7/servers/slapd/daemon.c
===================================================================
--- openldap-2.4.7.orig/servers/slapd/daemon.c
+++ openldap-2.4.7/servers/slapd/daemon.c
@@ -1120,7 +1120,8 @@ slap_get_listener_addresses(
 	{
 #ifdef HAVE_GETADDRINFO
 		struct addrinfo hints, *res, *sai;
-		int n, err;
+		struct sockaddr **sap2;
+		int n, err, cmpres;
 		char serv[7];
 
 		memset( &hints, '\0', sizeof(hints) );
@@ -1146,43 +1147,60 @@ slap_get_listener_addresses(
 		*sap = NULL;
 
 		for ( sai=res; sai; sai=sai->ai_next ) {
+			cmpres=1;
 			if( sai->ai_addr == NULL ) {
 				Debug( LDAP_DEBUG_ANY, "slap_get_listener_addresses: "
 					"getaddrinfo ai_addr is NULL?\n", 0, 0, 0 );
 				freeaddrinfo(res);
 				goto errexit;
 			}
-
-			switch (sai->ai_family) {
-#  ifdef LDAP_PF_INET6
-			case AF_INET6:
-				*sap = ch_malloc(sizeof(struct sockaddr_in6));
-				if (*sap == NULL) {
-					freeaddrinfo(res);
-					goto errexit;
+			/* check for duplicates */
+			for ( sap2 = *sal; sap && *sap2; sap2++ ){
+				if ( sai->ai_family == (*sap2)->sa_family ) {
+					if (sai->ai_family == AF_INET6) {
+						cmpres = memcmp(sai->ai_addr, *sap2, 
+								sizeof(struct sockaddr_in6));
+					} else if (sai->ai_family == AF_INET) {
+						cmpres = memcmp(sai->ai_addr, *sap2, 
+								sizeof(struct sockaddr_in));
+					}
+					if (! cmpres ){
+						break;
+					}
 				}
-				*(struct sockaddr_in6 *)*sap =
-					*((struct sockaddr_in6 *)sai->ai_addr);
-				break;
+			}
+			if (cmpres){
+				switch (sai->ai_family) {
+#  ifdef LDAP_PF_INET6
+				case AF_INET6:
+					*sap = ch_malloc(sizeof(struct sockaddr_in6));
+					if (*sap == NULL) {
+						freeaddrinfo(res);
+						goto errexit;
+					}
+					*(struct sockaddr_in6 *)*sap =
+						*((struct sockaddr_in6 *)sai->ai_addr);
+					break;
 #  endif /* LDAP_PF_INET6 */
-			case AF_INET:
-				*sap = ch_malloc(sizeof(struct sockaddr_in));
-				if (*sap == NULL) {
-					freeaddrinfo(res);
-					goto errexit;
+				case AF_INET:
+					*sap = ch_malloc(sizeof(struct sockaddr_in));
+					if (*sap == NULL) {
+						freeaddrinfo(res);
+						goto errexit;
+					}
+					*(struct sockaddr_in *)*sap =
+						*((struct sockaddr_in *)sai->ai_addr);
+					break;
+				default:
+					*sap = NULL;
+					break;
 				}
-				*(struct sockaddr_in *)*sap =
-					*((struct sockaddr_in *)sai->ai_addr);
-				break;
-			default:
-				*sap = NULL;
-				break;
-			}
 
-			if (*sap != NULL) {
-				(*sap)->sa_family = sai->ai_family;
-				sap++;
-				*sap = NULL;
+				if (*sap != NULL) {
+					(*sap)->sa_family = sai->ai_family;
+					sap++;
+					*sap = NULL;
+				}
 			}
 		}
 
openSUSE Build Service is sponsored by