[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