[SCM] Samba Shared Repository - branch master updated - release-4-0-0alpha7-1162-g9930e5b

Stefan Metzmacher metze at samba.org
Mon Apr 20 16:23:30 GMT 2009


The branch, master has been updated
       via  9930e5b3db6b47fa4a1611ed0719ed73340bf8c0 (commit)
       via  a98a9c39a2dedb50a81f0b9709fa437f5a0fd880 (commit)
       via  ed98cba5ab8f585bc83e732fd61a2c04c48c0607 (commit)
       via  d0e68032187d7167d535d710f01a1c84ac006f3c (commit)
       via  f3c9d124bb302ded239a835a6173fbfe262a0bab (commit)
       via  e6b796b936993e485356eaabd4370858c4f802fd (commit)
       via  900d569bede23972ddaf9603f3a63bf7e3d007e1 (commit)
      from  4e1b633dab6fdd42425c43de07a57808c9003cb6 (commit)

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


- Log -----------------------------------------------------------------
commit 9930e5b3db6b47fa4a1611ed0719ed73340bf8c0
Author: Stefan Metzmacher <metze at samba.org>
Date:   Fri Apr 17 13:05:04 2009 +0200

    pidl:Samba4/client: fix dcerpc_ndr_request_send() callers
    
    For samba4 you need one of this:
    samba/source4# make full_idl
    samba/source4# make clean
    samba# git clean -x -f
    
    metze

commit a98a9c39a2dedb50a81f0b9709fa437f5a0fd880
Author: Stefan Metzmacher <metze at samba.org>
Date:   Fri Apr 17 11:48:31 2009 +0200

    s4:librpc/rpc: pass async as argument to dcerpc_ndr_request_send()
    
    The caller should decide if async is desired it should be harcoded per call.
    
    metze

commit ed98cba5ab8f585bc83e732fd61a2c04c48c0607
Author: Stefan Metzmacher <metze at samba.org>
Date:   Fri Apr 17 13:04:18 2009 +0200

    pidl:Samba4/client: use dcerpc_ndr_request() for sync requests
    
    metze

commit d0e68032187d7167d535d710f01a1c84ac006f3c
Author: Stefan Metzmacher <metze at samba.org>
Date:   Fri Apr 17 11:46:57 2009 +0200

    s4:librpc/rpc: remove async argument from the sync dcerpc_request() function
    
    metze

commit f3c9d124bb302ded239a835a6173fbfe262a0bab
Author: Stefan Metzmacher <metze at samba.org>
Date:   Fri Apr 17 11:40:40 2009 +0200

    s4:librpc/rpc: only use smb_trans for sync rpc calls
    
    Over named pipes we can only do one smb_trans at a time,
    otherwise we're getting NT_STATUS_PIPE_BUSY.
    Async rpc calls need to use smb_read/write only.
    
    metze

commit e6b796b936993e485356eaabd4370858c4f802fd
Author: Stefan Metzmacher <metze at samba.org>
Date:   Fri Apr 17 19:57:15 2009 +0200

    s4:torture/rpc: use dcerpc_ndr_request() for the object_uuid test
    
    As we want sync calls...
    
    metze

commit 900d569bede23972ddaf9603f3a63bf7e3d007e1
Author: Stefan Metzmacher <metze at samba.org>
Date:   Fri Apr 17 19:57:39 2009 +0200

    s4:librpc/rpc: ask for 0x2000 bytes in the ioctl case to match all othercases
    
    metze

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

Summary of changes:
 pidl/lib/Parse/Pidl/Samba4/NDR/Client.pm |   17 ++++++++-----
 source4/librpc/rpc/dcerpc.c              |   37 ++++++++++++++++++++---------
 source4/librpc/rpc/dcerpc.h              |    2 +-
 source4/librpc/rpc/dcerpc_smb2.c         |    2 +-
 source4/librpc/rpc/pyrpc.c               |    2 +-
 source4/torture/rpc/autoidl.c            |    8 +++---
 source4/torture/rpc/countcalls.c         |    2 +-
 source4/torture/rpc/object_uuid.c        |   18 ++++++--------
 source4/torture/rpc/scanner.c            |    2 +-
 9 files changed, 52 insertions(+), 38 deletions(-)


Changeset truncated at 500 lines:

diff --git a/pidl/lib/Parse/Pidl/Samba4/NDR/Client.pm b/pidl/lib/Parse/Pidl/Samba4/NDR/Client.pm
index f2a96a3..9d3ccaf 100644
--- a/pidl/lib/Parse/Pidl/Samba4/NDR/Client.pm
+++ b/pidl/lib/Parse/Pidl/Samba4/NDR/Client.pm
@@ -34,8 +34,9 @@ sub ParseFunctionSend($$$)
 	if (p->conn->flags & DCERPC_DEBUG_PRINT_IN) {
 		NDR_PRINT_IN_DEBUG($name, r);
 	}
-	
-	return dcerpc_ndr_request_send(p, NULL, &ndr_table_$interface->{NAME}, NDR_$uname, mem_ctx, r);
+
+	return dcerpc_ndr_request_send(p, NULL, &ndr_table_$interface->{NAME},
+				       NDR_$uname, true, mem_ctx, r);
 ";
 	}
 
@@ -45,6 +46,7 @@ sub ParseFunctionSend($$$)
 sub ParseFunctionSync($$$)
 {
 	my ($interface, $fn, $name) = @_;
+	my $uname = uc $name;
 
 	my $proto = "NTSTATUS dcerpc_$name(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, struct $name *r)";
 
@@ -55,13 +57,14 @@ sub ParseFunctionSync($$$)
 		$res .= "\treturn NT_STATUS_NOT_IMPLEMENTED;\n";
 	} else {
 		$res .= "
-	struct rpc_request *req;
 	NTSTATUS status;
-	
-	req = dcerpc_$name\_send(p, mem_ctx, r);
-	if (req == NULL) return NT_STATUS_NO_MEMORY;
 
-	status = dcerpc_ndr_request_recv(req);
+	if (p->conn->flags & DCERPC_DEBUG_PRINT_IN) {
+		NDR_PRINT_IN_DEBUG($name, r);
+	}
+
+	status = dcerpc_ndr_request(p, NULL, &ndr_table_$interface->{NAME},
+				    NDR_$uname, mem_ctx, r);
 
 	if (NT_STATUS_IS_OK(status) && (p->conn->flags & DCERPC_DEBUG_PRINT_OUT)) {
 		NDR_PRINT_OUT_DEBUG($name, r);		
diff --git a/source4/librpc/rpc/dcerpc.c b/source4/librpc/rpc/dcerpc.c
index 7a568d3..c8add30 100644
--- a/source4/librpc/rpc/dcerpc.c
+++ b/source4/librpc/rpc/dcerpc.c
@@ -1058,6 +1058,7 @@ static void dcerpc_ship_next_request(struct dcerpc_connection *c)
 	while (remaining > 0 || first_packet) {
 		uint32_t chunk = MIN(chunk_size, remaining);
 		bool last_frag = false;
+		bool do_trans = false;
 
 		first_packet = false;
 		pkt.pfc_flags &= ~(DCERPC_PFC_FLAG_FIRST |DCERPC_PFC_FLAG_LAST);
@@ -1080,14 +1081,27 @@ static void dcerpc_ship_next_request(struct dcerpc_connection *c)
 			DLIST_REMOVE(p->conn->pending, req);
 			return;
 		}
-		
-		req->status = p->conn->transport.send_request(p->conn, &blob, last_frag);
+
+		if (last_frag && !req->async_call) {
+			do_trans = true;
+		}
+
+		req->status = p->conn->transport.send_request(p->conn, &blob, do_trans);
 		if (!NT_STATUS_IS_OK(req->status)) {
 			req->state = RPC_REQUEST_DONE;
 			DLIST_REMOVE(p->conn->pending, req);
 			return;
 		}		
 
+		if (last_frag && !do_trans) {
+			req->status = p->conn->transport.send_read(p->conn);
+			if (!NT_STATUS_IS_OK(req->status)) {
+				req->state = RPC_REQUEST_DONE;
+				DLIST_REMOVE(p->conn->pending, req);
+				return;
+			}
+		}
+
 		remaining -= chunk;
 	}
 }
@@ -1136,14 +1150,13 @@ NTSTATUS dcerpc_request_recv(struct rpc_request *req,
 NTSTATUS dcerpc_request(struct dcerpc_pipe *p, 
 			struct GUID *object,
 			uint16_t opnum,
-			bool async,
 			TALLOC_CTX *mem_ctx,
 			DATA_BLOB *stub_data_in,
 			DATA_BLOB *stub_data_out)
 {
 	struct rpc_request *req;
 
-	req = dcerpc_request_send(p, object, opnum, async, stub_data_in);
+	req = dcerpc_request_send(p, object, opnum, false, stub_data_in);
 	if (req == NULL) {
 		return NT_STATUS_NO_MEMORY;
 	}
@@ -1335,11 +1348,12 @@ static NTSTATUS dcerpc_ndr_validate_out(struct dcerpc_connection *c,
  send a rpc request given a dcerpc_call structure 
  */
 struct rpc_request *dcerpc_ndr_request_send(struct dcerpc_pipe *p,
-						const struct GUID *object,
-						const struct ndr_interface_table *table,
-						uint32_t opnum, 
-						TALLOC_CTX *mem_ctx, 
-						void *r)
+					    const struct GUID *object,
+					    const struct ndr_interface_table *table,
+					    uint32_t opnum,
+					    bool async,
+					    TALLOC_CTX *mem_ctx,
+					    void *r)
 {
 	const struct ndr_interface_call *call;
 	struct ndr_push *push;
@@ -1388,8 +1402,7 @@ struct rpc_request *dcerpc_ndr_request_send(struct dcerpc_pipe *p,
 	dump_data(10, request.data, request.length);
 
 	/* make the actual dcerpc request */
-	req = dcerpc_request_send(p, object, opnum, table->calls[opnum].async,
-				  &request);
+	req = dcerpc_request_send(p, object, opnum, async, &request);
 
 	if (req != NULL) {
 		req->ndr.table = table;
@@ -1506,7 +1519,7 @@ _PUBLIC_ NTSTATUS dcerpc_ndr_request(struct dcerpc_pipe *p,
 {
 	struct rpc_request *req;
 
-	req = dcerpc_ndr_request_send(p, object, table, opnum, mem_ctx, r);
+	req = dcerpc_ndr_request_send(p, object, table, opnum, false, mem_ctx, r);
 	if (req == NULL) {
 		return NT_STATUS_NO_MEMORY;
 	}
diff --git a/source4/librpc/rpc/dcerpc.h b/source4/librpc/rpc/dcerpc.h
index d6619ac..7f573f0 100644
--- a/source4/librpc/rpc/dcerpc.h
+++ b/source4/librpc/rpc/dcerpc.h
@@ -256,6 +256,7 @@ struct rpc_request *dcerpc_ndr_request_send(struct dcerpc_pipe *p,
 						const struct GUID *object,
 						const struct ndr_interface_table *table,
 						uint32_t opnum, 
+						bool async,
 						TALLOC_CTX *mem_ctx, 
 						void *r);
 const char *dcerpc_server_name(struct dcerpc_pipe *p);
@@ -376,7 +377,6 @@ NTSTATUS dcerpc_binding_from_tower(TALLOC_CTX *mem_ctx,
 NTSTATUS dcerpc_request(struct dcerpc_pipe *p, 
 			struct GUID *object,
 			uint16_t opnum,
-			bool async,
 			TALLOC_CTX *mem_ctx,
 			DATA_BLOB *stub_data_in,
 			DATA_BLOB *stub_data_out);
diff --git a/source4/librpc/rpc/dcerpc_smb2.c b/source4/librpc/rpc/dcerpc_smb2.c
index 84ba811..e493365 100644
--- a/source4/librpc/rpc/dcerpc_smb2.c
+++ b/source4/librpc/rpc/dcerpc_smb2.c
@@ -258,7 +258,7 @@ static NTSTATUS smb2_send_trans_request(struct dcerpc_connection *c, DATA_BLOB *
 	ZERO_STRUCT(io);
 	io.in.file.handle	= smb->handle;
 	io.in.function		= FSCTL_NAMED_PIPE_READ_WRITE;
-	io.in.max_response_size	= 0x1000;
+	io.in.max_response_size	= 0x2000;
 	io.in.flags		= 1;
 	io.in.out		= *blob;
 
diff --git a/source4/librpc/rpc/pyrpc.c b/source4/librpc/rpc/pyrpc.c
index 252883c..82bb870 100644
--- a/source4/librpc/rpc/pyrpc.c
+++ b/source4/librpc/rpc/pyrpc.c
@@ -247,7 +247,7 @@ static PyObject *py_iface_request(PyObject *self, PyObject *args, PyObject *kwar
 	}
 
 	status = dcerpc_request(iface->pipe, object?&object_guid:NULL,
-				opnum, false, mem_ctx, &data_in, &data_out);
+				opnum, mem_ctx, &data_in, &data_out);
 
 	if (NT_STATUS_IS_ERR(status)) {
 		PyErr_SetDCERPCStatus(iface->pipe, status);
diff --git a/source4/torture/rpc/autoidl.c b/source4/torture/rpc/autoidl.c
index 5ae0201..6345712 100644
--- a/source4/torture/rpc/autoidl.c
+++ b/source4/torture/rpc/autoidl.c
@@ -131,7 +131,7 @@ static void try_expand(struct torture_context *tctx, const struct ndr_interface_
 		memcpy(stub_in.data, base_in->data, insert_ofs);
 		memcpy(stub_in.data+insert_ofs+n, base_in->data+insert_ofs, base_in->length-insert_ofs);
 
-		status = dcerpc_request(p, NULL, opnum, false, tctx, &stub_in, &stub_out);
+		status = dcerpc_request(p, NULL, opnum, tctx, &stub_in, &stub_out);
 
 		if (!NT_STATUS_EQUAL(status, NT_STATUS_NET_WRITE_FAULT)) {
 			print_depth(depth);
@@ -172,7 +172,7 @@ static void test_ptr_scan(struct torture_context *tctx, const struct ndr_interfa
 	/* work out which elements are pointers */
 	for (ofs=min_ofs;ofs<=max_ofs-4;ofs+=4) {
 		SIVAL(stub_in.data, ofs, 1);
-		status = dcerpc_request(p, NULL, opnum, false, tctx, &stub_in, &stub_out);
+		status = dcerpc_request(p, NULL, opnum, tctx, &stub_in, &stub_out);
 
 		if (NT_STATUS_EQUAL(status, NT_STATUS_NET_WRITE_FAULT)) {
 			print_depth(depth);
@@ -214,7 +214,7 @@ static void test_scan_call(struct torture_context *tctx, const struct ndr_interf
 		data_blob_clear(&stub_in);
 
 
-		status = dcerpc_request(p, NULL, opnum, false, tctx, &stub_in, &stub_out);
+		status = dcerpc_request(p, NULL, opnum, tctx, &stub_in, &stub_out);
 
 		if (NT_STATUS_IS_OK(status)) {
 			printf("opnum %d   min_input %d - output %d\n", 
@@ -227,7 +227,7 @@ static void test_scan_call(struct torture_context *tctx, const struct ndr_interf
 
 		fill_blob_handle(&stub_in, tctx, &handle);
 
-		status = dcerpc_request(p, NULL, opnum, false, tctx, &stub_in, &stub_out);
+		status = dcerpc_request(p, NULL, opnum, tctx, &stub_in, &stub_out);
 
 		if (NT_STATUS_IS_OK(status)) {
 			printf("opnum %d   min_input %d - output %d (with handle)\n", 
diff --git a/source4/torture/rpc/countcalls.c b/source4/torture/rpc/countcalls.c
index 205ee1e..4914ae1 100644
--- a/source4/torture/rpc/countcalls.c
+++ b/source4/torture/rpc/countcalls.c
@@ -60,7 +60,7 @@ bool count_calls(struct torture_context *tctx,
 	printf("\nScanning pipe '%s'\n", iface->name);
 
 	for (i=0;i<500;i++) {
-		status = dcerpc_request(p, NULL, i, false, p, &stub_in, &stub_out);
+		status = dcerpc_request(p, NULL, i, p, &stub_in, &stub_out);
 		if (NT_STATUS_EQUAL(status, NT_STATUS_NET_WRITE_FAULT) &&
 		    p->last_fault_code == DCERPC_FAULT_OP_RNG_ERROR) {
 			i--;
diff --git a/source4/torture/rpc/object_uuid.c b/source4/torture/rpc/object_uuid.c
index 6990516..a702666 100644
--- a/source4/torture/rpc/object_uuid.c
+++ b/source4/torture/rpc/object_uuid.c
@@ -53,11 +53,10 @@ static bool test_random_uuid(struct torture_context *torture)
 	uuid = GUID_random();
 
 	r1.in.level = DS_ROLE_BASIC_INFORMATION;
-	req = dcerpc_ndr_request_send(p1, &uuid,
-				      &ndr_table_dssetup,
-				      NDR_DSSETUP_DSROLEGETPRIMARYDOMAININFORMATION,
-				      torture, &r1);
-	status = dcerpc_ndr_request_recv(req);
+	status = dcerpc_ndr_request(p1, &uuid,
+				    &ndr_table_dssetup,
+				    NDR_DSSETUP_DSROLEGETPRIMARYDOMAININFORMATION,
+				    torture, &r1);
 	torture_assert_ntstatus_ok(torture, status, "DsRoleGetPrimaryDomainInformation failed");
 	torture_assert_werr_ok(torture, r1.out.result, "DsRoleGetPrimaryDomainInformation failed");
 
@@ -69,11 +68,10 @@ static bool test_random_uuid(struct torture_context *torture)
 	r2.out.account_name = &account_name_p;
 	r2.out.authority_name = &authority_name_p;
 
-	req = dcerpc_ndr_request_send(p2, &uuid,
-				      &ndr_table_lsarpc,
-				      NDR_LSA_GETUSERNAME,
-				      torture, &r2);
-	status = dcerpc_ndr_request_recv(req);
+	status = dcerpc_ndr_request(p2, &uuid,
+				    &ndr_table_lsarpc,
+				    NDR_LSA_GETUSERNAME,
+				    torture, &r2);
 	torture_assert_ntstatus_ok(torture, status, "lsaClose failed");
 	torture_assert_ntstatus_ok(torture, r2.out.result, "lsaClose failed");
 
diff --git a/source4/torture/rpc/scanner.c b/source4/torture/rpc/scanner.c
index b761f40..8e5016b 100644
--- a/source4/torture/rpc/scanner.c
+++ b/source4/torture/rpc/scanner.c
@@ -61,7 +61,7 @@ static bool test_num_calls(struct torture_context *tctx,
 	memset(stub_in.data, 0xFF, stub_in.length);
 
 	for (i=0;i<200;i++) {
-		status = dcerpc_request(p, NULL, i, false, mem_ctx, &stub_in, &stub_out);
+		status = dcerpc_request(p, NULL, i, mem_ctx, &stub_in, &stub_out);
 		if (!NT_STATUS_IS_OK(status) &&
 		    p->last_fault_code == DCERPC_FAULT_OP_RNG_ERROR) {
 			break;


-- 
Samba Shared Repository


More information about the samba-cvs mailing list