mirror of
https://github.com/samba-team/samba.git
synced 2025-11-04 00:23:49 +03:00
Fix convert_ss2service() to filter out zero addresses.
This commit is contained in:
@@ -1513,32 +1513,53 @@ NTSTATUS name_query(const char *name, int name_type,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/********************************************************
|
/********************************************************
|
||||||
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;
|
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,
|
static bool convert_ss2service(struct ip_service **return_iplist,
|
||||||
const struct sockaddr_storage *ss_list,
|
const struct sockaddr_storage *ss_list,
|
||||||
int count)
|
int *pcount)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
int orig_count = *pcount;
|
||||||
|
int real_count = 0;
|
||||||
|
|
||||||
if ( count==0 || !ss_list )
|
if (orig_count==0 || !ss_list )
|
||||||
return False;
|
return False;
|
||||||
|
|
||||||
|
/* Filter out zero addrs. */
|
||||||
|
for ( i=0; i<orig_count; i++ ) {
|
||||||
|
if (is_zero_addr(&ss_list[i])) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
real_count++;
|
||||||
|
}
|
||||||
|
if (real_count==0) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
/* copy the ip address; port will be PORT_NONE */
|
/* 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) {
|
NULL) {
|
||||||
DEBUG(0,("convert_ip2service: malloc failed "
|
DEBUG(0,("convert_ip2service: malloc failed "
|
||||||
"for %d enetries!\n", count ));
|
"for %d enetries!\n", real_count ));
|
||||||
return False;
|
return False;
|
||||||
}
|
}
|
||||||
|
|
||||||
for ( i=0; i<count; i++ ) {
|
for ( i=0, real_count = 0; i<orig_count; i++ ) {
|
||||||
(*return_iplist)[i].ss = ss_list[i];
|
if (is_zero_addr(&ss_list[i])) {
|
||||||
(*return_iplist)[i].port = PORT_NONE;
|
continue;
|
||||||
|
}
|
||||||
|
(*return_iplist)[real_count].ss = ss_list[i];
|
||||||
|
(*return_iplist)[real_count].port = PORT_NONE;
|
||||||
|
real_count++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
*pcount = real_count;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2253,7 +2274,7 @@ static NTSTATUS resolve_lmhosts(const char *name, int name_type,
|
|||||||
if (NT_STATUS_IS_OK(status)) {
|
if (NT_STATUS_IS_OK(status)) {
|
||||||
if (convert_ss2service(return_iplist,
|
if (convert_ss2service(return_iplist,
|
||||||
ss_list,
|
ss_list,
|
||||||
*return_count)) {
|
return_count)) {
|
||||||
talloc_free(ctx);
|
talloc_free(ctx);
|
||||||
return NT_STATUS_OK;
|
return NT_STATUS_OK;
|
||||||
} else {
|
} else {
|
||||||
@@ -2321,7 +2342,7 @@ static NTSTATUS resolve_hosts(const char *name, int name_type,
|
|||||||
if (NT_STATUS_IS_OK(status)) {
|
if (NT_STATUS_IS_OK(status)) {
|
||||||
if (convert_ss2service(return_iplist,
|
if (convert_ss2service(return_iplist,
|
||||||
ss_list,
|
ss_list,
|
||||||
*return_count)) {
|
return_count)) {
|
||||||
talloc_free(ctx);
|
talloc_free(ctx);
|
||||||
return NT_STATUS_OK;
|
return NT_STATUS_OK;
|
||||||
} else {
|
} else {
|
||||||
@@ -2618,7 +2639,7 @@ NTSTATUS internal_resolve_name(const char *name,
|
|||||||
if (NT_STATUS_IS_OK(status)) {
|
if (NT_STATUS_IS_OK(status)) {
|
||||||
if (!convert_ss2service(return_iplist,
|
if (!convert_ss2service(return_iplist,
|
||||||
ss_list,
|
ss_list,
|
||||||
*return_count)) {
|
return_count)) {
|
||||||
status = NT_STATUS_NO_MEMORY;
|
status = NT_STATUS_NO_MEMORY;
|
||||||
}
|
}
|
||||||
goto done;
|
goto done;
|
||||||
@@ -2632,7 +2653,7 @@ NTSTATUS internal_resolve_name(const char *name,
|
|||||||
if (NT_STATUS_IS_OK(status)) {
|
if (NT_STATUS_IS_OK(status)) {
|
||||||
if (!convert_ss2service(return_iplist,
|
if (!convert_ss2service(return_iplist,
|
||||||
ss_list,
|
ss_list,
|
||||||
*return_count)) {
|
return_count)) {
|
||||||
status = NT_STATUS_NO_MEMORY;
|
status = NT_STATUS_NO_MEMORY;
|
||||||
}
|
}
|
||||||
goto done;
|
goto done;
|
||||||
|
|||||||
Reference in New Issue
Block a user