From: Jeremy Allison Date: Fri, 27 Apr 2012 23:25:58 +0000 (-0700) Subject: Protect all of the name resolution methods from returning null addrs. Ensure all... X-Git-Url: http://git.samba.org/?p=ddiss%2Fsamba.git;a=commitdiff_plain;h=495f12d932a2ec2848a17917e6f1aa39590dc97d Protect all of the name resolution methods from returning null addrs. Ensure all returns go through remove_duplicate_addrs2(). (cherry picked from commit 11973608186926e5417ee81c8709ea5b0a7ef2e1) --- diff --git a/source3/libsmb/namequery.c b/source3/libsmb/namequery.c index 15cb97cf5f2..9ba8aac43ff 100644 --- a/source3/libsmb/namequery.c +++ b/source3/libsmb/namequery.c @@ -1338,6 +1338,10 @@ static bool name_query_validator(struct packet_struct *p, void *private_data) putip((char *)&ip,&nmb->answers->rdata[2+i*6]); in_addr_to_sockaddr_storage(&addr, ip); + if (is_zero_addr(&addr)) { + continue; + } + for (j=0; jnum_addrs; j++) { if (sockaddr_equal( (struct sockaddr *)&addr, @@ -1822,6 +1826,10 @@ static NTSTATUS resolve_hosts(const char *name, int name_type, ZERO_STRUCT(ss); memcpy(&ss, res->ai_addr, res->ai_addrlen); + if (is_zero_addr(&ss)) { + continue; + } + *return_count += 1; *return_iplist = SMB_REALLOC_ARRAY(*return_iplist, @@ -2013,6 +2021,10 @@ NTSTATUS internal_resolve_name(const char *name, SAFE_FREE(*return_iplist); return NT_STATUS_INVALID_PARAMETER; } + if (is_zero_addr(&(*return_iplist)->ss)) { + SAFE_FREE(*return_iplist); + return NT_STATUS_UNSUCCESSFUL; + } *return_count = 1; return NT_STATUS_OK; } @@ -2020,6 +2032,8 @@ NTSTATUS internal_resolve_name(const char *name, /* Check name cache */ if (namecache_fetch(name, name_type, return_iplist, return_count)) { + *return_count = remove_duplicate_addrs2(*return_iplist, + *return_count ); /* This could be a negative response */ if (*return_count > 0) { return NT_STATUS_OK; @@ -2120,10 +2134,7 @@ NTSTATUS internal_resolve_name(const char *name, controllers including the PDC in iplist[1..n]. Iterating over the iplist when the PDC is down will cause two sets of timeouts. */ - if ( *return_count ) { - *return_count = remove_duplicate_addrs2(*return_iplist, - *return_count ); - } + *return_count = remove_duplicate_addrs2(*return_iplist, *return_count ); /* Save in name cache */ if ( DEBUGLEVEL >= 100 ) { @@ -2139,7 +2150,9 @@ NTSTATUS internal_resolve_name(const char *name, } } - namecache_store(name, name_type, *return_count, *return_iplist); + if (*return_count) { + namecache_store(name, name_type, *return_count, *return_iplist); + } /* Display some debugging info */ @@ -2602,10 +2615,7 @@ static NTSTATUS get_dc_list(const char *domain, /* need to remove duplicates in the list if we have any explicit password servers */ - if (local_count) { - local_count = remove_duplicate_addrs2(return_iplist, - local_count ); - } + local_count = remove_duplicate_addrs2(return_iplist, local_count ); /* For DC's we always prioritize IPv4 due to W2K3 not * supporting LDAP, KRB5 or CLDAP over IPv6. */