r17124: fixed a bug which caused resolve_ads() to spin forever if one of the
authorAndrew Tridgell <tridge@samba.org>
Wed, 19 Jul 2006 00:13:01 +0000 (00:13 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 16:38:13 +0000 (11:38 -0500)
DCs isn't resolvable in DNS. The fix is to leave that DC out of the
returned list of DCs. I think the original code intended that anyway,
just didn't quite get it right ('i' wasn't incremented in that code
path, so the loop didn't terminate)
(This used to be commit d7ec9f3cc0439e9e0f4c98988b14ae2155d931b9)

source3/libsmb/namequery.c

index 0172ab9514e320f3386a7c266ce925fde9cd6cbd..f6dbe3c548347d3c5f4b0616df0f5e632fa8c20d 100644 (file)
@@ -1051,16 +1051,18 @@ static BOOL resolve_ads(const char *name, int name_type,
                return False;
        }
 
-       i = 0;
-       while ( i < numdcs ) {
+       *return_count = 0;
+
+       for (i=0;i<numdcs;i++) {
+               struct ip_service *r = &(*return_iplist)[*return_count];
 
                /* use the IP address from the SRV structure if we have one */
                if ( is_zero_ip( dcs[i].ip ) )
-                       (*return_iplist)[i].ip   = *interpret_addr2(dcs[i].hostname);
+                       r->ip   = *interpret_addr2(dcs[i].hostname);
                else
-                       (*return_iplist)[i].ip = dcs[i].ip;
+                       r->ip = dcs[i].ip;
 
-               (*return_iplist)[i].port = dcs[i].port;
+               r->port = dcs[i].port;
                        
                /* make sure it is a valid IP.  I considered checking the negative
                   connection cache, but this is the wrong place for it.  Maybe only
@@ -1069,15 +1071,11 @@ static BOOL resolve_ads(const char *name, int name_type,
                   The standard reason for falling back to netbios lookups is that 
                   our DNS server doesn't know anything about the DC's   -- jerry */    
                           
-               if ( is_zero_ip((*return_iplist)[i].ip) )
-                       continue;               
-
-               i++;
+               if ( ! is_zero_ip(r->ip) )
+                       (*return_count)++;
        }
                
        TALLOC_FREE( dcs );
-               
-       *return_count = i;
                                
        return True;
 }