[SCM] Samba Shared Repository - branch master updated
Volker Lendecke
vlendec at samba.org
Tue Dec 28 10:22:01 MST 2010
The branch, master has been updated
via 4622812 s3: Make name_query return NTSTATUS
via 28d997a s3: AllowDebugChange is gone
via 5f79588 Fix a memleak in nss_wins
via 181cd32 Fix a crash in libnss_wins
from 5717114 s3: Make node_status_query return NTSTATUS
http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master
- Log -----------------------------------------------------------------
commit 4622812a41eb5ce07dd8f74534217e858743883f
Author: Volker Lendecke <vl at samba.org>
Date: Tue Dec 28 13:47:35 2010 +0100
s3: Make name_query return NTSTATUS
Also use talloc for the result
Autobuild-User: Volker Lendecke <vlendec at samba.org>
Autobuild-Date: Tue Dec 28 18:21:05 CET 2010 on sn-devel-104
commit 28d997a89056f144de6a7b95af0e54a044c5e5b3
Author: Volker Lendecke <vl at samba.org>
Date: Tue Dec 28 17:17:04 2010 +0100
s3: AllowDebugChange is gone
commit 5f79588de07754ef112abac33535a34624b3b078
Author: Volker Lendecke <vl at samba.org>
Date: Tue Dec 28 17:08:57 2010 +0100
Fix a memleak in nss_wins
commit 181cd3281c4f2c53dc507f59d281a2517579cfe1
Author: Volker Lendecke <vl at samba.org>
Date: Tue Dec 28 17:05:18 2010 +0100
Fix a crash in libnss_wins
lp_set_parm accesses the case tables
-----------------------------------------------------------------------
Summary of changes:
nsswitch/wins.c | 10 +++++---
source3/client/client.c | 1 -
source3/include/proto.h | 4 ++-
source3/libsmb/namequery.c | 46 +++++++++++++++++++++----------------
source3/utils/nmblookup.c | 23 ++++++++++--------
source3/web/diagnose.c | 10 +++++---
source3/winbindd/winbindd_wins.c | 25 +++++++++++++-------
7 files changed, 70 insertions(+), 49 deletions(-)
Changeset truncated at 500 lines:
diff --git a/nsswitch/wins.c b/nsswitch/wins.c
index 731efcb..ac062fe 100644
--- a/nsswitch/wins.c
+++ b/nsswitch/wins.c
@@ -40,8 +40,6 @@ static pthread_mutex_t wins_nss_mutex = PTHREAD_MUTEX_INITIALIZER;
static int initialised;
-extern bool AllowDebugChange;
-
NSS_STATUS _nss_wins_gethostbyname_r(const char *hostname, struct hostent *he,
char *buffer, size_t buflen, int *h_errnop);
NSS_STATUS _nss_wins_gethostbyname2_r(const char *name, int af, struct hostent *he,
@@ -94,11 +92,11 @@ static int wins_lookup_open_socket_in(void)
static void nss_wins_init(void)
{
initialised = 1;
+ load_case_tables();
lp_set_cmdline("log level", "0");
TimeInit();
setup_logging("nss_wins",False);
- load_case_tables();
lp_load(get_dyn_CONFIGFILE(),True,False,False,True);
load_interfaces();
}
@@ -142,16 +140,20 @@ 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;
}
in_addr_to_sockaddr_storage(&ss, *bcast);
- pss = name_query(fd,name,0x00,True,True,&ss,count, &flags, NULL);
+ status = name_query(fd, name, 0x00, True, True, &ss,
+ NULL, &pss, count, &flags, NULL);
if (pss) {
if ((ret = SMB_MALLOC_P(struct in_addr)) == NULL) {
return NULL;
}
*ret = ((struct sockaddr_in *)pss)->sin_addr;
+ TALLOC_FREE(pss);
break;
}
}
diff --git a/source3/client/client.c b/source3/client/client.c
index b3bbcf5..8486bb2 100644
--- a/source3/client/client.c
+++ b/source3/client/client.c
@@ -36,7 +36,6 @@
extern int do_smb_browse(void); /* mDNS browsing */
-extern bool AllowDebugChange;
extern bool override_logfile;
extern char tar_type;
diff --git a/source3/include/proto.h b/source3/include/proto.h
index 8278ffb..9b391ae 100644
--- a/source3/include/proto.h
+++ b/source3/include/proto.h
@@ -2712,12 +2712,14 @@ bool name_status_find(const char *q_name,
const struct sockaddr_storage *to_ss,
fstring name);
int ip_service_compare(struct ip_service *ss1, struct ip_service *ss2);
-struct sockaddr_storage *name_query(int fd,
+NTSTATUS name_query(int fd,
const char *name,
int name_type,
bool bcast,
bool recurse,
const struct sockaddr_storage *to_ss,
+ TALLOC_CTX *mem_ctx,
+ struct sockaddr_storage **addrs,
int *count,
int *flags,
bool *timed_out);
diff --git a/source3/libsmb/namequery.c b/source3/libsmb/namequery.c
index a283038..7016f6b 100644
--- a/source3/libsmb/namequery.c
+++ b/source3/libsmb/namequery.c
@@ -679,12 +679,14 @@ static bool prioritize_ipv4_list(struct ip_service *iplist, int count)
*timed_out is set if we failed by timing out
****************************************************************************/
-struct sockaddr_storage *name_query(int fd,
+NTSTATUS name_query(int fd,
const char *name,
int name_type,
bool bcast,
bool recurse,
const struct sockaddr_storage *to_ss,
+ TALLOC_CTX *mem_ctx,
+ struct sockaddr_storage **addrs,
int *count,
int *flags,
bool *timed_out)
@@ -701,11 +703,11 @@ struct sockaddr_storage *name_query(int fd,
if (lp_disable_netbios()) {
DEBUG(5,("name_query(%s#%02x): netbios is disabled\n",
name, name_type));
- return NULL;
+ return NT_STATUS_NOT_FOUND;
}
if (to_ss->ss_family != AF_INET) {
- return NULL;
+ return NT_STATUS_INVALID_ADDRESS;
}
if (timed_out) {
@@ -745,7 +747,7 @@ struct sockaddr_storage *name_query(int fd,
clock_gettime_mono(&tp);
if (!send_packet_request(&p))
- return NULL;
+ return NT_STATUS_NOT_FOUND;
retries--;
@@ -757,7 +759,7 @@ struct sockaddr_storage *name_query(int fd,
if (!retries)
break;
if (!found && !send_packet_request(&p))
- return NULL;
+ return NT_STATUS_NOT_FOUND;
clock_gettime_mono(&tp);
retries--;
}
@@ -806,7 +808,7 @@ struct sockaddr_storage *name_query(int fd,
}
}
free_packet(p2);
- return( NULL );
+ return NT_STATUS_NOT_FOUND;
}
if (nmb2->header.opcode != 0 ||
@@ -822,7 +824,7 @@ struct sockaddr_storage *name_query(int fd,
continue;
}
- ss_list = SMB_REALLOC_ARRAY(ss_list,
+ ss_list = TALLOC_REALLOC_ARRAY(mem_ctx, ss_list,
struct sockaddr_storage,
(*count) +
nmb2->answers->rdlength/6);
@@ -830,7 +832,7 @@ struct sockaddr_storage *name_query(int fd,
if (!ss_list) {
DEBUG(0,("name_query: Realloc failed.\n"));
free_packet(p2);
- return NULL;
+ return NT_STATUS_NO_MEMORY;
}
DEBUG(2,("Got a positive name query response "
@@ -882,7 +884,8 @@ struct sockaddr_storage *name_query(int fd,
/* sort the ip list so we choose close servers first if possible */
sort_addr_list(ss_list, *count);
- return ss_list;
+ *addrs = ss_list;
+ return NT_STATUS_OK;
}
/********************************************************
@@ -953,7 +956,7 @@ NTSTATUS name_resolve_bcast(const char *name,
sock = open_socket_in( SOCK_DGRAM, 0, 3, &ss, true );
if (sock == -1) {
- return NT_STATUS_UNSUCCESSFUL;
+ return map_nt_error_from_unix(errno);
}
set_socket_options(sock,"SO_BROADCAST");
@@ -969,9 +972,10 @@ NTSTATUS name_resolve_bcast(const char *name,
if (!pss) {
continue;
}
- ss_list = name_query(sock, name, name_type, true,
- true, pss, return_count, &flags, NULL);
- if (ss_list) {
+ status = name_query(sock, name, name_type, true, true, pss,
+ talloc_tos(), &ss_list, return_count,
+ &flags, NULL);
+ if (NT_STATUS_IS_OK(status)) {
goto success;
}
}
@@ -979,15 +983,14 @@ NTSTATUS name_resolve_bcast(const char *name,
/* failed - no response */
close(sock);
- return NT_STATUS_UNSUCCESSFUL;
+ return status;
success:
- status = NT_STATUS_OK;
if (!convert_ss2service(return_iplist, ss_list, *return_count) )
- status = NT_STATUS_INVALID_PARAMETER;
+ status = NT_STATUS_NO_MEMORY;
- SAFE_FREE(ss_list);
+ TALLOC_FREE(ss_list);
close(sock);
return status;
}
@@ -1083,20 +1086,23 @@ NTSTATUS resolve_wins(const char *name,
}
in_addr_to_sockaddr_storage(&wins_ss, wins_ip);
- ss_list = name_query(sock,
+ status = name_query(sock,
name,
name_type,
false,
true,
&wins_ss,
+ talloc_tos(),
+ &ss_list,
return_count,
&flags,
&timed_out);
/* exit loop if we got a list of addresses */
- if (ss_list)
+ if (NT_STATUS_IS_OK(status)) {
goto success;
+ }
close(sock);
@@ -1123,7 +1129,7 @@ success:
if (!convert_ss2service(return_iplist, ss_list, *return_count))
status = NT_STATUS_INVALID_PARAMETER;
- SAFE_FREE(ss_list);
+ TALLOC_FREE(ss_list);
wins_srv_tags_free(wins_tags);
close(sock);
diff --git a/source3/utils/nmblookup.c b/source3/utils/nmblookup.c
index 5bbd06c..4a55647 100644
--- a/source3/utils/nmblookup.c
+++ b/source3/utils/nmblookup.c
@@ -156,14 +156,16 @@ static bool query_one(const char *lookup, unsigned int lookup_type)
{
int j, count, flags = 0;
struct sockaddr_storage *ip_list=NULL;
+ NTSTATUS status;
if (got_bcast) {
char addr[INET6_ADDRSTRLEN];
print_sockaddr(addr, sizeof(addr), &bcast_addr);
d_printf("querying %s on %s\n", lookup, addr);
- ip_list = name_query(ServerFD,lookup,lookup_type,use_bcast,
- use_bcast?true:recursion_desired,
- &bcast_addr, &count, &flags, NULL);
+ status = name_query(ServerFD,lookup,lookup_type,use_bcast,
+ use_bcast?true:recursion_desired,
+ &bcast_addr, talloc_tos(),
+ &ip_list, &count, &flags, NULL);
} else {
const struct in_addr *bcast;
for (j=iface_count() - 1;
@@ -180,14 +182,15 @@ static bool query_one(const char *lookup, unsigned int lookup_type)
print_sockaddr(addr, sizeof(addr), &bcast_ss);
d_printf("querying %s on %s\n",
lookup, addr);
- ip_list = name_query(ServerFD,lookup,lookup_type,
- use_bcast,
- use_bcast?True:recursion_desired,
- &bcast_ss,&count, &flags, NULL);
+ status = name_query(ServerFD,lookup,lookup_type,
+ use_bcast,
+ use_bcast?True:recursion_desired,
+ &bcast_ss, talloc_tos(),
+ &ip_list, &count, &flags, NULL);
}
}
- if (!ip_list) {
+ if (!NT_STATUS_IS_OK(status)) {
return false;
}
@@ -220,9 +223,9 @@ static bool query_one(const char *lookup, unsigned int lookup_type)
}
}
- free(ip_list);
+ TALLOC_FREE(ip_list);
- return (ip_list != NULL);
+ return NT_STATUS_IS_OK(status);
}
diff --git a/source3/web/diagnose.c b/source3/web/diagnose.c
index 221ce83..df61658 100644
--- a/source3/web/diagnose.c
+++ b/source3/web/diagnose.c
@@ -44,10 +44,12 @@ bool nmbd_running(void)
if ((fd = open_socket_in(SOCK_DGRAM, 0, 3,
&ss, True)) != -1) {
- if ((ss_list = name_query(fd, "__SAMBA__", 0,
- True, True, &ss,
- &count, &flags, NULL)) != NULL) {
- SAFE_FREE(ss_list);
+ NTSTATUS status = name_query(fd, "__SAMBA__", 0,
+ True, True, &ss,
+ talloc_tos(), &ss_list, &count,
+ &flags, NULL);
+ if (NT_STATUS_IS_OK(status)) {
+ TALLOC_FREE(ss_list);
close(fd);
return True;
}
diff --git a/source3/winbindd/winbindd_wins.c b/source3/winbindd/winbindd_wins.c
index 484b393..720feaf 100644
--- a/source3/winbindd/winbindd_wins.c
+++ b/source3/winbindd/winbindd_wins.c
@@ -96,13 +96,15 @@ static struct node_status *lookup_byaddr_backend(TALLOC_CTX *mem_ctx,
return result;
}
-static struct sockaddr_storage *lookup_byname_backend(const char *name,
- int *count)
+static struct sockaddr_storage *lookup_byname_backend(TALLOC_CTX *mem_ctx,
+ const char *name,
+ int *count)
{
int fd;
struct ip_service *ret = NULL;
struct sockaddr_storage *return_ss = NULL;
int j, i, flags = 0;
+ NTSTATUS status;
*count = 0;
@@ -110,7 +112,9 @@ static struct sockaddr_storage *lookup_byname_backend(const char *name,
if (NT_STATUS_IS_OK(resolve_wins(name,0x20,&ret,count))) {
if ( *count == 0 )
return NULL;
- if ( (return_ss = SMB_MALLOC_ARRAY(struct sockaddr_storage, *count)) == NULL ) {
+ return_ss = TALLOC_ARRAY(mem_ctx, struct sockaddr_storage,
+ *count);
+ if (return_ss == NULL ) {
free( ret );
return NULL;
}
@@ -136,8 +140,9 @@ static struct sockaddr_storage *lookup_byname_backend(const char *name,
if (!bcast_ss) {
continue;
}
- return_ss = name_query(fd,name,0x20,True,True,bcast_ss,count, &flags, NULL);
- if (return_ss) {
+ status = name_query(fd, name, 0x20, True, True,bcast_ss,
+ mem_ctx, &return_ss, count, &flags, NULL);
+ if (NT_STATUS_IS_OK(status)) {
break;
}
}
@@ -213,12 +218,14 @@ void winbindd_wins_byname(struct winbindd_cli_state *state)
*response = '\0';
maxlen = sizeof(response) - 1;
- if ((ip_list = lookup_byname_backend(state->request->data.winsreq,&count))){
+ ip_list = lookup_byname_backend(
+ state->mem_ctx, state->request->data.winsreq, &count);
+ if (ip_list != NULL){
for (i = count; i ; i--) {
print_sockaddr(addr, sizeof(addr), &ip_list[i-1]);
size = strlen(addr);
if (size > maxlen) {
- SAFE_FREE(ip_list);
+ TALLOC_FREE(ip_list);
request_error(state);
return;
}
@@ -235,13 +242,13 @@ void winbindd_wins_byname(struct winbindd_cli_state *state)
}
size = strlen(state->request->data.winsreq) + strlen(response);
if (size > maxlen) {
- SAFE_FREE(ip_list);
+ TALLOC_FREE(ip_list);
request_error(state);
return;
}
fstrcat(response,state->request->data.winsreq);
fstrcat(response,"\n");
- SAFE_FREE(ip_list);
+ TALLOC_FREE(ip_list);
} else {
request_error(state);
return;
--
Samba Shared Repository
More information about the samba-cvs
mailing list