Fix remove_duplicate_addrs2 to do exactly what it says. Previously it could leave...
authorJeremy Allison <jra@samba.org>
Mon, 30 Apr 2012 23:16:39 +0000 (16:16 -0700)
committerKarolin Seeger <kseeger@samba.org>
Sat, 30 Jun 2012 11:43:38 +0000 (13:43 +0200)
(cherry picked from commit 8e9db61b447d22bad84a8c9ae450a71d9c3e6d58)

source3/libsmb/namequery.c

index 858330db2acad53d424dd15506d0d36693f9501f..ff43706175feea51bab98a8ea2b373de01adbb65 100644 (file)
@@ -571,7 +571,7 @@ static int remove_duplicate_addrs2(struct ip_service *iplist, int count )
        DEBUG(10,("remove_duplicate_addrs2: "
                        "looking for duplicate address/port pairs\n"));
 
-       /* one loop to remove duplicates */
+       /* One loop to set duplicates to a zero addr. */
        for ( i=0; i<count; i++ ) {
                if ( is_zero_addr((struct sockaddr *)&iplist[i].ss)) {
                        continue;
@@ -585,18 +585,17 @@ static int remove_duplicate_addrs2(struct ip_service *iplist, int count )
                }
        }
 
-       /* one loop to clean up any holes we left */
-       /* first ip should never be a zero_ip() */
-       for (i = 0; i<count; ) {
-               if (is_zero_addr((struct sockaddr *)&iplist[i].ss) ) {
-                       if (i != count-1) {
-                               memmove(&iplist[i], &iplist[i+1],
-                                       (count - i - 1)*sizeof(iplist[i]));
+       /* Now remove any addresses set to zero above. */
+       for (i = 0; i < count; i++) {
+               while (i < count &&
+                               is_zero_addr((struct sockaddr *)&iplist[i].ss)) {
+                       if (count-i-1>0) {
+                               memmove(&iplist[i],
+                                       &iplist[i+1],
+                                       (count-i-1)*sizeof(struct ip_service));
                        }
                        count--;
-                       continue;
                }
-               i++;
        }
 
        return count;