diff options
-rw-r--r-- | source3/libsmb/namequery.c | 41 |
1 files changed, 31 insertions, 10 deletions
diff --git a/source3/libsmb/namequery.c b/source3/libsmb/namequery.c index ff43706175f..b68448e16ae 100644 --- a/source3/libsmb/namequery.c +++ b/source3/libsmb/namequery.c @@ -848,32 +848,53 @@ struct sockaddr_storage *name_query(int fd, } /******************************************************** - convert an array if struct sockaddr_storage to struct ip_service + Convert an array if struct sockaddr_storage to struct ip_service return false on failure. Port is set to PORT_NONE; + pcount is [in/out] - it is the length of ss_list on input, + and the length of return_iplist on output as we remove any + zero addresses from ss_list. *********************************************************/ static bool convert_ss2service(struct ip_service **return_iplist, const struct sockaddr_storage *ss_list, - int count) + int *pcount) { int i; + int orig_count = *pcount; + int real_count = 0; - if ( count==0 || !ss_list ) + if (orig_count==0 || !ss_list ) return False; + /* Filter out zero addrs. */ + for ( i=0; i<orig_count; i++ ) { + if (is_zero_addr((struct sockaddr *)&ss_list[i])) { + continue; + } + real_count++; + } + if (real_count==0) { + return false; + } + /* copy the ip address; port will be PORT_NONE */ - if ((*return_iplist = SMB_MALLOC_ARRAY(struct ip_service, count)) == + if ((*return_iplist = SMB_MALLOC_ARRAY(struct ip_service, real_count)) == NULL) { DEBUG(0,("convert_ip2service: malloc failed " - "for %d enetries!\n", count )); + "for %d enetries!\n", real_count )); return False; } - for ( i=0; i<count; i++ ) { - (*return_iplist)[i].ss = ss_list[i]; - (*return_iplist)[i].port = PORT_NONE; + for ( i=0, real_count = 0; i<orig_count; i++ ) { + if (is_zero_addr((struct sockaddr *)&ss_list[i])) { + continue; + } + (*return_iplist)[real_count].ss = ss_list[i]; + (*return_iplist)[real_count].port = PORT_NONE; + real_count++; } + *pcount = real_count; return true; } @@ -946,7 +967,7 @@ NTSTATUS name_resolve_bcast(const char *name, success: status = NT_STATUS_OK; - if (!convert_ss2service(return_iplist, ss_list, *return_count) ) + if (!convert_ss2service(return_iplist, ss_list, return_count) ) status = NT_STATUS_INVALID_PARAMETER; SAFE_FREE(ss_list); @@ -1081,7 +1102,7 @@ NTSTATUS resolve_wins(const char *name, success: status = NT_STATUS_OK; - if (!convert_ss2service(return_iplist, ss_list, *return_count)) + if (!convert_ss2service(return_iplist, ss_list, return_count)) status = NT_STATUS_INVALID_PARAMETER; SAFE_FREE(ss_list); |