The branch, master has been updated via 522e4f3... s4:RPC-ECHO: don't ignore errors in the Sleep test now that we support async rpc over ncacn_np via 340bcf6... s4:rpc_server/remote: do async calls via ff17d8a... s4:srvsvc RPC - make this one "signed-safe" via b963741... s4:unixinfo RPC - make this one "signed-safe" via 932a986... s4:spoolss RPC - make this one "signed-safe" via 246742b... s4:remote RPC - make this one "signed-safe" via c953b26... s4:epmapper RPC - make this one "signed-safe" from d6a6872... s3: Abstract access to sessionid.tdb, similar to conn_tdb.c
http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master - Log ----------------------------------------------------------------- commit 522e4f3d2bcd260f7037fbafd4340a9a4513c89d Author: Stefan Metzmacher <me...@samba.org> Date: Sat Feb 27 10:16:56 2010 +0100 s4:RPC-ECHO: don't ignore errors in the Sleep test now that we support async rpc over ncacn_np metze commit 340bcf646baf0a01ca55f66e787d1d49ddea6086 Author: Stefan Metzmacher <me...@samba.org> Date: Mon Mar 1 15:20:19 2010 +0100 s4:rpc_server/remote: do async calls metze commit ff17d8ab1ee809e1c464b9c8cb088f2e8fbf3cb3 Author: Matthias Dieter Wallnöfer <mwallnoe...@yahoo.de> Date: Sat Nov 21 19:08:42 2009 +0100 s4:srvsvc RPC - make this one "signed-safe" commit b963741aae82b721655e36e8c62b678acff2e210 Author: Matthias Dieter Wallnöfer <mwallnoe...@yahoo.de> Date: Sat Nov 21 19:03:59 2009 +0100 s4:unixinfo RPC - make this one "signed-safe" commit 932a986a4f3122555654d36d838996a90b1e69a7 Author: Matthias Dieter Wallnöfer <mwallnoe...@yahoo.de> Date: Sat Nov 21 19:03:18 2009 +0100 s4:spoolss RPC - make this one "signed-safe" commit 246742b30eb90da4d2c314e7b60bfc62ef0275ec Author: Matthias Dieter Wallnöfer <mwallnoe...@yahoo.de> Date: Sat Nov 21 19:01:53 2009 +0100 s4:remote RPC - make this one "signed-safe" commit c953b262419b8f67a7976b1f82d14e76893a7ec2 Author: Matthias Dieter Wallnöfer <mwallnoe...@yahoo.de> Date: Sat Nov 21 18:59:30 2009 +0100 s4:epmapper RPC - make this one "signed-safe" ----------------------------------------------------------------------- Summary of changes: source4/rpc_server/epmapper/rpc_epmapper.c | 4 +- source4/rpc_server/remote/dcesrv_remote.c | 52 +++++++++++++++++++++---- source4/rpc_server/spoolss/dcesrv_spoolss.c | 2 +- source4/rpc_server/srvsvc/dcesrv_srvsvc.c | 39 +++++++++--------- source4/rpc_server/unixinfo/dcesrv_unixinfo.c | 2 +- source4/torture/rpc/echo.c | 6 +- 6 files changed, 71 insertions(+), 34 deletions(-) Changeset truncated at 500 lines: diff --git a/source4/rpc_server/epmapper/rpc_epmapper.c b/source4/rpc_server/epmapper/rpc_epmapper.c index ade8b69..87bfee6 100644 --- a/source4/rpc_server/epmapper/rpc_epmapper.c +++ b/source4/rpc_server/epmapper/rpc_epmapper.c @@ -103,7 +103,7 @@ static error_status_t dcesrv_epm_Lookup(struct dcesrv_call_state *dce_call, TALL struct dcesrv_ep_iface *e; } *eps; uint32_t num_ents; - int i; + unsigned int i; DCESRV_PULL_HANDLE_FAULT(h, r->in.entry_handle, HTYPE_LOOKUP); @@ -168,7 +168,7 @@ static error_status_t dcesrv_epm_Map(struct dcesrv_call_state *dce_call, TALLOC_ struct epm_Map *r) { uint32_t count; - int i; + unsigned int i; struct dcesrv_ep_iface *eps; struct epm_floor *floors; enum dcerpc_transport_t transport; diff --git a/source4/rpc_server/remote/dcesrv_remote.c b/source4/rpc_server/remote/dcesrv_remote.c index 45944bc..0521603 100644 --- a/source4/rpc_server/remote/dcesrv_remote.c +++ b/source4/rpc_server/remote/dcesrv_remote.c @@ -186,6 +186,8 @@ static NTSTATUS remote_op_ndr_pull(struct dcesrv_call_state *dce_call, TALLOC_CT return NT_STATUS_OK; } +static void remote_op_dispatch_done(struct rpc_request *rreq); + static NTSTATUS remote_op_dispatch(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, void *r) { struct dcesrv_remote_private *priv = dce_call->context->private_data; @@ -193,6 +195,7 @@ static NTSTATUS remote_op_dispatch(struct dcesrv_call_state *dce_call, TALLOC_CT const struct ndr_interface_table *table = dce_call->context->iface->private_data; const struct ndr_interface_call *call; const char *name; + struct rpc_request *rreq; name = table->calls[opnum].name; call = &table->calls[opnum]; @@ -204,20 +207,53 @@ static NTSTATUS remote_op_dispatch(struct dcesrv_call_state *dce_call, TALLOC_CT priv->c_pipe->conn->flags |= DCERPC_NDR_REF_ALLOC; /* we didn't use the return code of this function as we only check the last_fault_code */ - dcerpc_ndr_request(priv->c_pipe, NULL, table, opnum, mem_ctx,r); + rreq = dcerpc_ndr_request_send(priv->c_pipe, NULL, table, opnum, true, mem_ctx, r); + if (rreq == NULL) { + DEBUG(0,("dcesrv_remote: call[%s] dcerpc_ndr_request_send() failed!\n", name)); + return NT_STATUS_NO_MEMORY; + } + rreq->async.callback = remote_op_dispatch_done; + rreq->async.private_data = dce_call; + + dce_call->state_flags |= DCESRV_CALL_STATE_FLAG_ASYNC; + return NT_STATUS_OK; +} + +static void remote_op_dispatch_done(struct rpc_request *rreq) +{ + struct dcesrv_call_state *dce_call = talloc_get_type_abort(rreq->async.private_data, + struct dcesrv_call_state); + struct dcesrv_remote_private *priv = dce_call->context->private_data; + uint16_t opnum = dce_call->pkt.u.request.opnum; + const struct ndr_interface_table *table = dce_call->context->iface->private_data; + const struct ndr_interface_call *call; + const char *name; + NTSTATUS status; + + name = table->calls[opnum].name; + call = &table->calls[opnum]; + + /* we didn't use the return code of this function as we only check the last_fault_code */ + status = dcerpc_ndr_request_recv(rreq); dce_call->fault_code = priv->c_pipe->last_fault_code; if (dce_call->fault_code != 0) { - DEBUG(0,("dcesrv_remote: call[%s] failed with: %s!\n",name, dcerpc_errstr(mem_ctx, dce_call->fault_code))); - return NT_STATUS_NET_WRITE_FAULT; + DEBUG(0,("dcesrv_remote: call[%s] failed with: %s!\n", + name, dcerpc_errstr(dce_call, dce_call->fault_code))); + goto reply; } - if ((dce_call->fault_code == 0) && + if (NT_STATUS_IS_OK(status) && (priv->c_pipe->conn->flags & DCERPC_DEBUG_PRINT_OUT)) { - ndr_print_function_debug(call->ndr_print, name, NDR_OUT, r); + ndr_print_function_debug(call->ndr_print, name, NDR_OUT, dce_call->r); } - return NT_STATUS_OK; +reply: + status = dcesrv_reply(dce_call); + if (!NT_STATUS_IS_OK(status)) { + DEBUG(0,("dcesrv_remote: call[%s]: dcesrv_reply() failed - %s\n", + name, nt_errstr(status))); + } } static NTSTATUS remote_op_ndr_push(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, struct ndr_push *push, const void *r) @@ -238,7 +274,7 @@ static NTSTATUS remote_op_ndr_push(struct dcesrv_call_state *dce_call, TALLOC_CT static NTSTATUS remote_register_one_iface(struct dcesrv_context *dce_ctx, const struct dcesrv_interface *iface) { - int i; + unsigned int i; const struct ndr_interface_table *table = iface->private_data; for (i=0;i<table->endpoints->count;i++) { @@ -257,7 +293,7 @@ static NTSTATUS remote_register_one_iface(struct dcesrv_context *dce_ctx, const static NTSTATUS remote_op_init_server(struct dcesrv_context *dce_ctx, const struct dcesrv_endpoint_server *ep_server) { - int i; + unsigned int i; const char **ifaces = (const char **)str_list_make(dce_ctx, lp_parm_string(dce_ctx->lp_ctx, NULL, "dcerpc_remote", "interfaces"),NULL); if (!ifaces) { diff --git a/source4/rpc_server/spoolss/dcesrv_spoolss.c b/source4/rpc_server/spoolss/dcesrv_spoolss.c index 0e071dc..2921b6b 100644 --- a/source4/rpc_server/spoolss/dcesrv_spoolss.c +++ b/source4/rpc_server/spoolss/dcesrv_spoolss.c @@ -151,7 +151,7 @@ static WERROR dcesrv_spoolss_check_server_name(struct dcesrv_call_state *dce_cal struct socket_address *myaddr; const char **aliases; const char *dnsdomain; - int i; + unsigned int i; /* NULL is ok */ if (!server_name) return WERR_OK; diff --git a/source4/rpc_server/srvsvc/dcesrv_srvsvc.c b/source4/rpc_server/srvsvc/dcesrv_srvsvc.c index ac53fd7..90edadb 100644 --- a/source4/rpc_server/srvsvc/dcesrv_srvsvc.c +++ b/source4/rpc_server/srvsvc/dcesrv_srvsvc.c @@ -431,8 +431,8 @@ static WERROR dcesrv_srvsvc_NetShareAdd(struct dcesrv_call_state *dce_call, TALL NTSTATUS nterr; struct share_info *info; struct share_context *sctx; - int count = 8; - int i; + unsigned int count = 8; + unsigned int i; nterr = share_get_context_by_name(mem_ctx, lp_share_backend(dce_call->conn->dce_ctx->lp_ctx), dce_call->event_ctx, dce_call->conn->dce_ctx->lp_ctx, &sctx); if (!NT_STATUS_IS_OK(nterr)) { @@ -529,8 +529,8 @@ static WERROR dcesrv_srvsvc_NetShareAdd(struct dcesrv_call_state *dce_call, TALL NTSTATUS nterr; struct share_info *info; struct share_context *sctx; - int count = 10; - int i; + unsigned int count = 10; + unsigned int i; nterr = share_get_context_by_name(mem_ctx, lp_share_backend(dce_call->conn->dce_ctx->lp_ctx), dce_call->event_ctx, dce_call->conn->dce_ctx->lp_ctx, &sctx); if (!NT_STATUS_IS_OK(nterr)) { @@ -733,7 +733,7 @@ static WERROR dcesrv_srvsvc_NetShareEnumAll(struct dcesrv_call_state *dce_call, switch (r->in.info_ctr->level) { case 0: { - int i; + unsigned int i; struct srvsvc_NetShareCtr0 *ctr0; ctr0 = talloc(mem_ctx, struct srvsvc_NetShareCtr0); @@ -774,7 +774,7 @@ static WERROR dcesrv_srvsvc_NetShareEnumAll(struct dcesrv_call_state *dce_call, } case 1: { - int i; + unsigned int i; struct srvsvc_NetShareCtr1 *ctr1; ctr1 = talloc(mem_ctx, struct srvsvc_NetShareCtr1); @@ -816,7 +816,7 @@ static WERROR dcesrv_srvsvc_NetShareEnumAll(struct dcesrv_call_state *dce_call, } case 2: { - int i; + unsigned int i; struct srvsvc_NetShareCtr2 *ctr2; SRVSVC_CHECK_ADMIN_ACCESS; @@ -860,7 +860,7 @@ static WERROR dcesrv_srvsvc_NetShareEnumAll(struct dcesrv_call_state *dce_call, } case 501: { - int i; + unsigned int i; struct srvsvc_NetShareCtr501 *ctr501; SRVSVC_CHECK_ADMIN_ACCESS; @@ -904,7 +904,7 @@ static WERROR dcesrv_srvsvc_NetShareEnumAll(struct dcesrv_call_state *dce_call, } case 502: { - int i; + unsigned int i; struct srvsvc_NetShareCtr502 *ctr502; SRVSVC_CHECK_ADMIN_ACCESS; @@ -1102,7 +1102,7 @@ static WERROR dcesrv_srvsvc_fill_share_info(struct share_info *info, int *count, uint32_t csc_policy, struct security_descriptor *sd) { - int i = 0; + unsigned int i = 0; if (level == 501) { info[i].name = SHARE_CSC_POLICY; @@ -1383,7 +1383,8 @@ static WERROR dcesrv_srvsvc_NetShareCheck(struct dcesrv_call_state *dce_call, TA struct share_config *scfg = NULL; char *device; const char **names; - int count, i; + int count; + unsigned int i; *r->out.type = 0; @@ -1833,8 +1834,8 @@ static WERROR dcesrv_srvsvc_NetShareEnum(struct dcesrv_call_state *dce_call, TAL switch (r->in.info_ctr->level) { case 0: { - int i, y = 0; - int count; + unsigned int i, y = 0; + unsigned int count; struct srvsvc_NetShareCtr0 *ctr0; ctr0 = talloc(mem_ctx, struct srvsvc_NetShareCtr0); @@ -1885,8 +1886,8 @@ static WERROR dcesrv_srvsvc_NetShareEnum(struct dcesrv_call_state *dce_call, TAL } case 1: { - int i, y = 0; - int count; + unsigned int i, y = 0; + unsigned int count; struct srvsvc_NetShareCtr1 *ctr1; ctr1 = talloc(mem_ctx, struct srvsvc_NetShareCtr1); @@ -1937,8 +1938,8 @@ static WERROR dcesrv_srvsvc_NetShareEnum(struct dcesrv_call_state *dce_call, TAL } case 2: { - int i, y = 0; - int count; + unsigned int i, y = 0; + unsigned int count; struct srvsvc_NetShareCtr2 *ctr2; SRVSVC_CHECK_ADMIN_ACCESS; @@ -1991,8 +1992,8 @@ static WERROR dcesrv_srvsvc_NetShareEnum(struct dcesrv_call_state *dce_call, TAL } case 502: { - int i, y = 0; - int count; + unsigned int i, y = 0; + unsigned int count; struct srvsvc_NetShareCtr502 *ctr502; SRVSVC_CHECK_ADMIN_ACCESS; diff --git a/source4/rpc_server/unixinfo/dcesrv_unixinfo.c b/source4/rpc_server/unixinfo/dcesrv_unixinfo.c index 0a1e9f6..2ef34ce 100644 --- a/source4/rpc_server/unixinfo/dcesrv_unixinfo.c +++ b/source4/rpc_server/unixinfo/dcesrv_unixinfo.c @@ -195,7 +195,7 @@ static NTSTATUS dcesrv_unixinfo_GetPWUid(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, struct unixinfo_GetPWUid *r) { - int i; + unsigned int i; *r->out.count = 0; diff --git a/source4/torture/rpc/echo.c b/source4/torture/rpc/echo.c index 2321500..e0ee8a5 100644 --- a/source4/torture/rpc/echo.c +++ b/source4/torture/rpc/echo.c @@ -289,9 +289,9 @@ static bool test_sleep(struct torture_context *tctx, torture_comment(tctx, "Slept for %u seconds (reply takes %u.%06u seconds - ok)\n", r[i].out.result, (unsigned int)diff[i].tv_sec, (unsigned int)diff[i].tv_usec); } else { - torture_comment(tctx, "(Failed) - Not async - Slept for %u seconds (but reply takes %u.%06u seconds)", - r[i].out.result, (unsigned int)diff[i].tv_sec, (unsigned int)diff[i].tv_usec); - /* TODO: let the test fail here, when we support async rpc on ncacn_np */ + torture_fail(tctx, talloc_asprintf(tctx, + "(Failed) - Not async - Slept for %u seconds (but reply takes %u.%06u seconds)\n", + r[i].out.result, (unsigned int)diff[i].tv_sec, (unsigned int)diff[i].tv_usec)); } } } -- Samba Shared Repository