diff options
-rw-r--r-- | nsswitch/wins.c | 15 | ||||
-rw-r--r-- | source3/include/proto.h | 3 | ||||
-rw-r--r-- | source3/libsmb/namequery.c | 22 | ||||
-rw-r--r-- | source3/winbindd/winbindd_wins.c | 18 |
4 files changed, 25 insertions, 33 deletions
diff --git a/nsswitch/wins.c b/nsswitch/wins.c index 5c9ad2fb05..d63968b2bc 100644 --- a/nsswitch/wins.c +++ b/nsswitch/wins.c @@ -60,8 +60,9 @@ static void nss_wins_init(void) static struct in_addr *lookup_byname_backend(const char *name, int *count) { TALLOC_CTX *frame = talloc_stackframe(); - struct ip_service *address = NULL; + struct sockaddr_storage *address = NULL; struct in_addr *ret = NULL; + NTSTATUS status; int j; if (!initialised) { @@ -71,21 +72,20 @@ static struct in_addr *lookup_byname_backend(const char *name, int *count) *count = 0; /* always try with wins first */ - if (NT_STATUS_IS_OK(resolve_wins(name,0x00,&address,count))) { + status = resolve_wins(name, 0x00, talloc_tos(), + &address, count); + if (NT_STATUS_IS_OK(status)) { if ( (ret = SMB_MALLOC_P(struct in_addr)) == NULL ) { - free( address ); TALLOC_FREE(frame); return NULL; } - if (address[0].ss.ss_family != AF_INET) { - free(address); + if (address[0].ss_family != AF_INET) { free(ret); TALLOC_FREE(frame); return NULL; } - *ret = ((struct sockaddr_in *)(void *)&address[0].ss) + *ret = ((struct sockaddr_in *)(void *)address) ->sin_addr; - free( address ); TALLOC_FREE(frame); return ret; } @@ -95,7 +95,6 @@ static struct in_addr *lookup_byname_backend(const char *name, int *count) const struct in_addr *bcast = iface_n_bcast_v4(j); struct sockaddr_storage ss; struct sockaddr_storage *pss; - NTSTATUS status; if (!bcast) { continue; diff --git a/source3/include/proto.h b/source3/include/proto.h index 1cde4be9a6..4a19f74d4c 100644 --- a/source3/include/proto.h +++ b/source3/include/proto.h @@ -1052,7 +1052,8 @@ NTSTATUS name_resolve_bcast(const char *name, int *return_count); NTSTATUS resolve_wins(const char *name, int name_type, - struct ip_service **return_iplist, + TALLOC_CTX *mem_ctx, + struct sockaddr_storage **return_iplist, int *return_count); NTSTATUS internal_resolve_name(const char *name, int name_type, diff --git a/source3/libsmb/namequery.c b/source3/libsmb/namequery.c index 511eba4cbf..5969f656c1 100644 --- a/source3/libsmb/namequery.c +++ b/source3/libsmb/namequery.c @@ -1799,12 +1799,13 @@ NTSTATUS name_resolve_bcast(const char *name, NTSTATUS resolve_wins(const char *name, int name_type, - struct ip_service **return_iplist, + TALLOC_CTX *mem_ctx, + struct sockaddr_storage **return_iplist, int *return_count) { int t, i; char **wins_tags; - struct sockaddr_storage src_ss, *ss_list = NULL; + struct sockaddr_storage src_ss; struct in_addr src_ip; NTSTATUS status; @@ -1882,8 +1883,8 @@ NTSTATUS resolve_wins(const char *name, false, true, &wins_ss, - talloc_tos(), - &ss_list, + mem_ctx, + return_iplist, return_count, NULL); @@ -1914,10 +1915,6 @@ NTSTATUS resolve_wins(const char *name, success: status = NT_STATUS_OK; - if (!convert_ss2service(return_iplist, ss_list, *return_count)) - status = NT_STATUS_INVALID_PARAMETER; - - TALLOC_FREE(ss_list); wins_srv_tags_free(wins_tags); return status; @@ -2314,11 +2311,18 @@ NTSTATUS internal_resolve_name(const char *name, } } else if(strequal( tok, "wins")) { /* don't resolve 1D via WINS */ + struct sockaddr_storage *ss_list; if (name_type != 0x1D) { status = resolve_wins(name, name_type, - return_iplist, + talloc_tos(), + &ss_list, return_count); if (NT_STATUS_IS_OK(status)) { + if (!convert_ss2service(return_iplist, + ss_list, + *return_count)) { + status = NT_STATUS_NO_MEMORY; + } goto done; } } diff --git a/source3/winbindd/winbindd_wins.c b/source3/winbindd/winbindd_wins.c index 7ed330f81b..25c04df6bc 100644 --- a/source3/winbindd/winbindd_wins.c +++ b/source3/winbindd/winbindd_wins.c @@ -31,29 +31,17 @@ static struct sockaddr_storage *lookup_byname_backend(TALLOC_CTX *mem_ctx, const char *name, int *count) { - struct ip_service *ret = NULL; struct sockaddr_storage *return_ss = NULL; - int j, i; + int j; NTSTATUS status; *count = 0; /* always try with wins first */ - if (NT_STATUS_IS_OK(resolve_wins(name,0x20,&ret,count))) { + status = resolve_wins(name, 0x20, mem_ctx, &return_ss, count); + if (NT_STATUS_IS_OK(status)) { if ( *count == 0 ) return NULL; - return_ss = talloc_array(mem_ctx, struct sockaddr_storage, - *count); - if (return_ss == NULL ) { - free( ret ); - return NULL; - } - - /* copy the IP addresses */ - for ( i=0; i<(*count); i++ ) - return_ss[i] = ret[i].ss; - - free( ret ); return return_ss; } |