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)
committerJeremy Allison <jra@samba.org>
Mon, 30 Apr 2012 16:26:37 +0000 (09:26 -0700)
source3/libsmb/namequery.c

index a604f05d81a5cf5bf3ad62dd45a4b3d16ed458bb..0f2c66f32a912da0983ab90c282ec6ee7c2b078b 100644 (file)
@@ -1109,7 +1109,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;
@@ -1124,18 +1124,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;