Fix remove_duplicate_addrs2 to do exactly what it says. Previously it could leave...
authorJeremy Allison <jra@samba.org>
Fri, 27 Apr 2012 23:02:15 +0000 (16:02 -0700)
committerKarolin Seeger <kseeger@samba.org>
Sat, 26 May 2012 20:15:21 +0000 (22:15 +0200)
source3/libsmb/namequery.c

index c36773b775d89e051bf649775d2d4896b2a91f3e..018725e3c1083db6198a463c8b584214655fd371 100644 (file)
@@ -1078,7 +1078,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(&iplist[i].ss)) {
                        continue;
@@ -1092,18 +1092,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(&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(&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;