[SCM] Samba Shared Repository - branch master updated

Volker Lendecke vlendec at samba.org
Sun Jun 5 05:20:02 MDT 2011


The branch, master has been updated
       via  114fbc3 s3: Fix a valgrind error
       via  5a6368f s3:winbind: Convert WINBINDD_WINS_BYIP to the async API
      from  2ce68d9 Make samba4.drs.fsmo.python knownfail

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit 114fbc385cbf00f2736a6d7a49447ab816dd5a7f
Author: Volker Lendecke <vl at samba.org>
Date:   Sun Jun 5 13:56:39 2011 +0200

    s3: Fix a valgrind error
    
    For me this fixes
    
    ==1950== Invalid read of size 4
    ==1950==    at 0x81EBED5: GUID_equal (uuid.c:239)
    ==1950==    by 0x81E51AB: ndr_syntax_id_equal (ndr_misc.c:35)
    ==1950==    by 0x82EB0D1: get_iface_from_syntax (rpc_common.c:160)
    ==1950==    by 0x82EB25E: get_pipe_name_from_syntax (rpc_common.c:179)
    ==1950==    by 0x8509E4F: close_policy_by_pipe (rpc_handles.c:322)
    ==1950==    by 0x8507941: close_internal_rpc_pipe_hnd (rpc_ncacn_np.c:109)
    ==1950==    by 0x468270: _talloc_free_internal (talloc.c:826)
    ==1950==    by 0x467EE0: _talloc_free_internal (talloc.c:1268)
    ==1950==    by 0x467EE0: _talloc_free_internal (talloc.c:1268)
    ==1950==    by 0x467EE0: _talloc_free_internal (talloc.c:1268)
    ==1950==    by 0x467EE0: _talloc_free_internal (talloc.c:1268)
    ==1950==    by 0x80E6487: sam_trusted_domains (winbindd_samr.c:406)
    ==1950==  Address 0x687ea4 is 20 bytes inside a block of size 40 free'd
    ==1950==    at 0x58CDC: free (in /usr/local/lib/valgrind/vgpreload_memcheck-x86-freebsd.so)
    ==1950==    by 0x8507812: free_pipe_rpc_context_internal (rpc_ncacn_np.c:74)
    ==1950==    by 0x8507936: close_internal_rpc_pipe_hnd (rpc_ncacn_np.c:106)
    ==1950==    by 0x468270: _talloc_free_internal (talloc.c:826)
    ==1950==    by 0x467EE0: _talloc_free_internal (talloc.c:1268)
    ==1950==    by 0x467EE0: _talloc_free_internal (talloc.c:1268)
    ==1950==    by 0x467EE0: _talloc_free_internal (talloc.c:1268)
    ==1950==    by 0x467EE0: _talloc_free_internal (talloc.c:1268)
    ==1950==    by 0x80E6487: sam_trusted_domains (winbindd_samr.c:406)
    ==1950==    by 0x80C2F85: trusted_domains (winbindd_cache.c:2820)
    ==1950==    by 0x80D5188: winbindd_dual_list_trusted_domains (winbindd_misc.c:162)
    ==1950==    by 0x80E987F: wb_child_request_trigger (winbindd_dual.c:437)
    ==1950==
    
    Andreas, Guenther, please check!
    
    Autobuild-User: Volker Lendecke <vlendec at samba.org>
    Autobuild-Date: Sun Jun  5 13:19:39 CEST 2011 on sn-devel-104

commit 5a6368f1e2a4348fdcdc062b2546eb45bf943aed
Author: Volker Lendecke <vl at samba.org>
Date:   Sun Jun 5 11:30:43 2011 +0200

    s3:winbind: Convert WINBINDD_WINS_BYIP to the async API

-----------------------------------------------------------------------

Summary of changes:
 source3/Makefile.in                   |    1 +
 source3/rpc_server/rpc_ncacn_np.c     |    4 +-
 source3/winbindd/winbindd.c           |    3 +-
 source3/winbindd/winbindd_proto.h     |    7 ++-
 source3/winbindd/winbindd_wins.c      |   71 -----------------
 source3/winbindd/winbindd_wins_byip.c |  135 +++++++++++++++++++++++++++++++++
 source3/wscript_build                 |    1 +
 7 files changed, 147 insertions(+), 75 deletions(-)
 create mode 100644 source3/winbindd/winbindd_wins_byip.c


Changeset truncated at 500 lines:

diff --git a/source3/Makefile.in b/source3/Makefile.in
index f95fbeb..f7458d3 100644
--- a/source3/Makefile.in
+++ b/source3/Makefile.in
@@ -1349,6 +1349,7 @@ WINBINDD_OBJ1 = \
 		winbindd/winbindd_misc.o  \
 		winbindd/winbindd_cm.o    \
 		winbindd/winbindd_wins.o  \
+		winbindd/winbindd_wins_byip.o  \
 		winbindd/winbindd_msrpc.o \
 		winbindd/winbindd_rpc.o   \
 		winbindd/winbindd_reconnect.o \
diff --git a/source3/rpc_server/rpc_ncacn_np.c b/source3/rpc_server/rpc_ncacn_np.c
index 4446578..e578c77 100644
--- a/source3/rpc_server/rpc_ncacn_np.c
+++ b/source3/rpc_server/rpc_ncacn_np.c
@@ -103,11 +103,11 @@ int close_internal_rpc_pipe_hnd(struct pipes_struct *p)
 
 	TALLOC_FREE(p->auth.auth_ctx);
 
-	free_pipe_rpc_context_internal( p->contexts );
-
 	/* Free the handles database. */
 	close_policy_by_pipe(p);
 
+	free_pipe_rpc_context_internal( p->contexts );
+
 	DLIST_REMOVE(InternalPipes, p);
 
 	ZERO_STRUCTP(p);
diff --git a/source3/winbindd/winbindd.c b/source3/winbindd/winbindd.c
index 677f766..8c6d91e 100644
--- a/source3/winbindd/winbindd.c
+++ b/source3/winbindd/winbindd.c
@@ -453,7 +453,6 @@ static struct winbindd_dispatch_table {
 	/* WINS functions */
 
 	{ WINBINDD_WINS_BYNAME, winbindd_wins_byname, "WINS_BYNAME" },
-	{ WINBINDD_WINS_BYIP, winbindd_wins_byip, "WINS_BYIP" },
 
 	/* End of list */
 
@@ -545,6 +544,8 @@ static struct winbindd_async_dispatch_table async_nonpriv_table[] = {
 	{ WINBINDD_PAM_CHNG_PSWD_AUTH_CRAP, "PAM_CHNG_PSWD_AUTH_CRAP",
 	  winbindd_pam_chng_pswd_auth_crap_send,
 	  winbindd_pam_chng_pswd_auth_crap_recv },
+	{ WINBINDD_WINS_BYIP, "PING",
+	  winbindd_wins_byip_send, winbindd_wins_byip_recv },
 
 	{ 0, NULL, NULL, NULL }
 };
diff --git a/source3/winbindd/winbindd_proto.h b/source3/winbindd/winbindd_proto.h
index ab61223..e0a582e 100644
--- a/source3/winbindd/winbindd_proto.h
+++ b/source3/winbindd/winbindd_proto.h
@@ -436,7 +436,6 @@ bool parse_sidlist(TALLOC_CTX *mem_ctx, const char *sidstr,
 
 /* The following definitions come from winbindd/winbindd_wins.c  */
 
-void winbindd_wins_byip(struct winbindd_cli_state *state);
 void winbindd_wins_byname(struct winbindd_cli_state *state);
 
 struct tevent_req *wb_ping_send(TALLOC_CTX *mem_ctx, struct tevent_context *ev,
@@ -861,6 +860,12 @@ struct tevent_req *winbindd_sids_to_xids_send(TALLOC_CTX *mem_ctx,
 					      struct winbindd_request *request);
 NTSTATUS winbindd_sids_to_xids_recv(struct tevent_req *req,
 				    struct winbindd_response *response);
+struct tevent_req *winbindd_wins_byip_send(TALLOC_CTX *mem_ctx,
+					   struct tevent_context *ev,
+					   struct winbindd_cli_state *cli,
+					   struct winbindd_request *request);
+NTSTATUS winbindd_wins_byip_recv(struct tevent_req *req,
+				 struct winbindd_response *presp);
 
 
 /* The following definitions come from winbindd/winbindd_samr.c  */
diff --git a/source3/winbindd/winbindd_wins.c b/source3/winbindd/winbindd_wins.c
index 5ac6109..a468b0f 100644
--- a/source3/winbindd/winbindd_wins.c
+++ b/source3/winbindd/winbindd_wins.c
@@ -27,26 +27,6 @@
 #undef DBGC_CLASS
 #define DBGC_CLASS DBGC_WINBIND
 
-static struct node_status *lookup_byaddr_backend(TALLOC_CTX *mem_ctx,
-						 const char *addr, int *count)
-{
-	struct sockaddr_storage ss;
-	struct nmb_name nname;
-	struct node_status *result;
-	NTSTATUS status;
-
-	make_nmb_name(&nname, "*", 0);
-	if (!interpret_string_addr(&ss, addr, AI_NUMERICHOST)) {
-		return NULL;
-	}
-	status = node_status_query(mem_ctx, &nname, &ss,
-				   &result, count, NULL);
-	if (!NT_STATUS_IS_OK(status)) {
-		return NULL;
-	}
-	return result;
-}
-
 static struct sockaddr_storage *lookup_byname_backend(TALLOC_CTX *mem_ctx,
 						      const char *name,
 						      int *count)
@@ -95,57 +75,6 @@ static struct sockaddr_storage *lookup_byname_backend(TALLOC_CTX *mem_ctx,
 	return return_ss;
 }
 
-/* Get hostname from IP  */
-
-void winbindd_wins_byip(struct winbindd_cli_state *state)
-{
-	fstring response;
-	int i, count, maxlen, size;
-	struct node_status *status;
-
-	/* Ensure null termination */
-	state->request->data.winsreq[sizeof(state->request->data.winsreq)-1]='\0';
-
-	DEBUG(3, ("[%5lu]: wins_byip %s\n", (unsigned long)state->pid,
-		state->request->data.winsreq));
-
-	*response = '\0';
-	maxlen = sizeof(response) - 1;
-
-	if ((status = lookup_byaddr_backend(
-		     state->mem_ctx, state->request->data.winsreq, &count))) {
-	    size = strlen(state->request->data.winsreq);
-	    if (size > maxlen) {
-		TALLOC_FREE(status);
-		request_error(state);
-		return;
-	    }
-	    fstrcat(response,state->request->data.winsreq);
-	    fstrcat(response,"\t");
-	    for (i = 0; i < count; i++) {
-		/* ignore group names */
-		if (status[i].flags & 0x80) continue;
-		if (status[i].type == 0x20) {
-			size = sizeof(status[i].name) + strlen(response);
-			if (size > maxlen) {
-			    TALLOC_FREE(status);
-			    request_error(state);
-			    return;
-			}
-			fstrcat(response, status[i].name);
-			fstrcat(response, " ");
-		}
-	    }
-	    /* make last character a newline */
-	    response[strlen(response)-1] = '\n';
-	    TALLOC_FREE(status);
-	}
-	strlcpy(state->response->data.winsresp,
-			response,
-			sizeof(state->response->data.winsresp));
-	request_ok(state);
-}
-
 /* Get IP from hostname */
 
 void winbindd_wins_byname(struct winbindd_cli_state *state)
diff --git a/source3/winbindd/winbindd_wins_byip.c b/source3/winbindd/winbindd_wins_byip.c
new file mode 100644
index 0000000..4ae1b82
--- /dev/null
+++ b/source3/winbindd/winbindd_wins_byip.c
@@ -0,0 +1,135 @@
+/*
+   Unix SMB/CIFS implementation.
+   async implementation of WINBINDD_WINS_BYIP
+   Copyright (C) Volker Lendecke 2011
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include "includes.h"
+#include "winbindd.h"
+#include "librpc/gen_ndr/ndr_wbint_c.h"
+#include "libsmb/nmblib.h"
+
+struct winbindd_wins_byip_state {
+	struct nmb_name star;
+	struct sockaddr_storage addr;
+	fstring response;
+};
+
+static void winbindd_wins_byip_done(struct tevent_req *subreq);
+
+struct tevent_req *winbindd_wins_byip_send(TALLOC_CTX *mem_ctx,
+					   struct tevent_context *ev,
+					   struct winbindd_cli_state *cli,
+					   struct winbindd_request *request)
+{
+	struct tevent_req *req, *subreq;
+	struct winbindd_wins_byip_state *state;
+
+	req = tevent_req_create(mem_ctx, &state,
+				struct winbindd_wins_byip_state);
+	if (req == NULL) {
+		return NULL;
+	}
+
+	/* Ensure null termination */
+	request->data.winsreq[sizeof(request->data.winsreq)-1]='\0';
+
+	fstr_sprintf(state->response, "%s\t", request->data.winsreq);
+
+	DEBUG(3, ("[%5lu]: wins_byip %s\n", (unsigned long)cli->pid,
+		  request->data.winsreq));
+
+	make_nmb_name(&state->star, "*", 0);
+
+	if (!interpret_string_addr(&state->addr, request->data.winsreq,
+				   AI_NUMERICHOST)) {
+		tevent_req_nterror(req, NT_STATUS_INVALID_PARAMETER);
+		return tevent_req_post(req, ev);
+	}
+
+	subreq = node_status_query_send(state, ev, &state->star,
+					&state->addr);
+	if (tevent_req_nomem(subreq, req)) {
+		return tevent_req_post(req, ev);
+	}
+	tevent_req_set_callback(subreq, winbindd_wins_byip_done, req);
+	return req;
+}
+
+static void winbindd_wins_byip_done(struct tevent_req *subreq)
+{
+	struct tevent_req *req = tevent_req_callback_data(
+		subreq, struct tevent_req);
+	struct winbindd_wins_byip_state *state = tevent_req_data(
+		req, struct winbindd_wins_byip_state);
+	struct node_status *names;
+	int i, num_names;
+	NTSTATUS status;
+
+	status = node_status_query_recv(subreq, talloc_tos(), &names,
+					&num_names, NULL);
+	TALLOC_FREE(subreq);
+	if (tevent_req_nterror(req, status)) {
+		return;
+	}
+
+	for (i=0; i<num_names; i++) {
+		size_t size;
+		/*
+		 * ignore group names
+		 */
+		if (names[i].flags & 0x80) {
+			continue;
+		}
+		/*
+		 * Only report 0x20
+		 */
+		if (names[i].type != 0x20) {
+			continue;
+		}
+
+		DEBUG(10, ("got name %s\n", names[i].name));
+
+		size = strlen(names[i].name + strlen(state->response));
+		if (size > sizeof(state->response) - 1) {
+			DEBUG(10, ("To much data\n"));
+			tevent_req_nterror(req, STATUS_BUFFER_OVERFLOW);
+			return;
+		}
+		fstrcat(state->response, names[i].name);
+		fstrcat(state->response, " ");
+	}
+	state->response[strlen(state->response)-1] = '\n';
+
+	DEBUG(10, ("response: %s", state->response));
+
+	TALLOC_FREE(names);
+	tevent_req_done(req);
+}
+
+NTSTATUS winbindd_wins_byip_recv(struct tevent_req *req,
+				 struct winbindd_response *presp)
+{
+	struct winbindd_wins_byip_state *state = tevent_req_data(
+		req, struct winbindd_wins_byip_state);
+	NTSTATUS status;
+
+	if (tevent_req_is_nterror(req, &status)) {
+		return status;
+	}
+	fstrcpy(presp->data.winsresp, state->response);
+	return NT_STATUS_OK;
+}
diff --git a/source3/wscript_build b/source3/wscript_build
index 834c7f5..4fd7a7b 100755
--- a/source3/wscript_build
+++ b/source3/wscript_build
@@ -255,6 +255,7 @@ WINBINDD_SRC1 = '''winbindd/winbindd.c
                    winbindd/winbindd_misc.c
                    winbindd/winbindd_cm.c
                    winbindd/winbindd_wins.c
+                   winbindd/winbindd_wins_byip.c
                    winbindd/winbindd_msrpc.c
                    winbindd/winbindd_rpc.c
                    winbindd/winbindd_reconnect.c


-- 
Samba Shared Repository


More information about the samba-cvs mailing list