1 From 4b942ee95cc351e4b123f57197ef19c79ae2b0aa Mon Sep 17 00:00:00 2001
2 From: Jeremy Allison <jra@samba.org>
3 Date: Fri, 24 Apr 2015 13:19:30 -0700
4 Subject: [PATCH] s4: rpc: Refactor dcesrv_alter() function into setup and send
9 https://bugzilla.samba.org/show_bug.cgi?id=11236
11 Based on code from Julien Kerihuel <j.kerihuel@openchange.org>
13 Signed-off-by: Jeremy Allison <jra@samba.org>
14 Reviewed-by: Andreas Schneider <asn@samba.org>
16 Autobuild-User(master): Jeremy Allison <jra@samba.org>
17 Autobuild-Date(master): Sat Apr 25 02:43:22 CEST 2015 on sn-devel-104
19 (cherry picked from commit 49030649db3dfec5a9bc03e5dde4255a14499f16)
21 source4/rpc_server/dcerpc_server.c | 114 ++++++++++++++++++++-----------------
22 1 file changed, 62 insertions(+), 52 deletions(-)
24 diff --git a/source4/rpc_server/dcerpc_server.c b/source4/rpc_server/dcerpc_server.c
25 index f25aa68..b1c763b 100644
26 --- a/source4/rpc_server/dcerpc_server.c
27 +++ b/source4/rpc_server/dcerpc_server.c
28 @@ -793,66 +793,31 @@ static NTSTATUS dcesrv_alter_new_context(struct dcesrv_call_state *call, uint32_
34 - handle a alter context request
36 -static NTSTATUS dcesrv_alter(struct dcesrv_call_state *call)
37 +/* setup and send an alter_resp */
38 +static NTSTATUS dcesrv_alter_resp(struct dcesrv_call_state *call,
42 struct ncacn_packet pkt;
43 - struct data_blob_list_item *rep;
45 - uint32_t result=0, reason=0;
46 - uint32_t context_id;
47 uint32_t extra_flags = 0;
48 + struct data_blob_list_item *rep = NULL;
51 - /* handle any authentication that is being requested */
52 - if (!dcesrv_auth_alter(call)) {
53 - /* TODO: work out the right reject code */
54 - result = DCERPC_BIND_PROVIDER_REJECT;
55 - reason = DCERPC_BIND_REASON_ASYNTAX;
58 - context_id = call->pkt.u.alter.ctx_list[0].context_id;
60 - /* see if they are asking for a new interface */
62 - call->context = dcesrv_find_context(call->conn, context_id);
63 - if (!call->context) {
64 - status = dcesrv_alter_new_context(call, context_id);
65 - if (!NT_STATUS_IS_OK(status)) {
66 - result = DCERPC_BIND_PROVIDER_REJECT;
67 - reason = DCERPC_BIND_REASON_ASYNTAX;
73 - call->pkt.u.alter.assoc_group_id != 0 &&
74 - lpcfg_parm_bool(call->conn->dce_ctx->lp_ctx, NULL, "dcesrv","assoc group checking", true) &&
75 - call->pkt.u.alter.assoc_group_id != call->context->assoc_group->id) {
76 - DEBUG(0,(__location__ ": Failed attempt to use new assoc_group in alter context (0x%08x 0x%08x)\n",
77 - call->context->assoc_group->id, call->pkt.u.alter.assoc_group_id));
78 - /* TODO: can they ask for a new association group? */
79 - result = DCERPC_BIND_PROVIDER_REJECT;
80 - reason = DCERPC_BIND_REASON_ASYNTAX;
83 - if ((call->pkt.pfc_flags & DCERPC_PFC_FLAG_CONC_MPX)) {
84 - if (call->context->conn->state_flags & DCESRV_CALL_STATE_FLAG_MULTIPLEXED) {
85 - extra_flags |= DCERPC_PFC_FLAG_CONC_MPX;
89 - if (call->state_flags & DCESRV_CALL_STATE_FLAG_PROCESS_PENDING_CALL) {
90 - call->context->conn->state_flags |= DCESRV_CALL_STATE_FLAG_PROCESS_PENDING_CALL;
93 - /* setup a alter_resp */
94 dcesrv_init_hdr(&pkt, lpcfg_rpc_big_endian(call->conn->dce_ctx->lp_ctx));
96 pkt.call_id = call->pkt.call_id;
97 pkt.ptype = DCERPC_PKT_ALTER_RESP;
99 + if ((call->pkt.pfc_flags & DCERPC_PFC_FLAG_CONC_MPX) &&
100 + call->context->conn->state_flags &
101 + DCESRV_CALL_STATE_FLAG_MULTIPLEXED) {
102 + extra_flags |= DCERPC_PFC_FLAG_CONC_MPX;
104 + if (call->state_flags & DCESRV_CALL_STATE_FLAG_PROCESS_PENDING_CALL) {
105 + call->context->conn->state_flags |=
106 + DCESRV_CALL_STATE_FLAG_PROCESS_PENDING_CALL;
109 pkt.pfc_flags = DCERPC_PFC_FLAG_FIRST | DCERPC_PFC_FLAG_LAST | extra_flags;
110 pkt.u.alter_resp.max_xmit_frag = 0x2000;
111 pkt.u.alter_resp.max_recv_frag = 0x2000;
112 @@ -908,6 +873,51 @@ static NTSTATUS dcesrv_alter(struct dcesrv_call_state *call)
116 + handle a alter context request
118 +static NTSTATUS dcesrv_alter(struct dcesrv_call_state *call)
121 + uint32_t context_id;
123 + /* handle any authentication that is being requested */
124 + if (!dcesrv_auth_alter(call)) {
125 + /* TODO: work out the right reject code */
126 + return dcesrv_alter_resp(call,
127 + DCERPC_BIND_PROVIDER_REJECT,
128 + DCERPC_BIND_REASON_ASYNTAX);
131 + context_id = call->pkt.u.alter.ctx_list[0].context_id;
133 + /* see if they are asking for a new interface */
134 + call->context = dcesrv_find_context(call->conn, context_id);
135 + if (!call->context) {
136 + status = dcesrv_alter_new_context(call, context_id);
137 + if (!NT_STATUS_IS_OK(status)) {
138 + return dcesrv_alter_resp(call,
139 + DCERPC_BIND_PROVIDER_REJECT,
140 + DCERPC_BIND_REASON_ASYNTAX);
144 + if (call->pkt.u.alter.assoc_group_id != 0 &&
145 + lpcfg_parm_bool(call->conn->dce_ctx->lp_ctx, NULL, "dcesrv","assoc group checking", true) &&
146 + call->pkt.u.alter.assoc_group_id != call->context->assoc_group->id) {
147 + DEBUG(0,(__location__ ": Failed attempt to use new assoc_group in alter context (0x%08x 0x%08x)\n",
148 + call->context->assoc_group->id, call->pkt.u.alter.assoc_group_id));
149 + /* TODO: can they ask for a new association group? */
150 + return dcesrv_alter_resp(call,
151 + DCERPC_BIND_PROVIDER_REJECT,
152 + DCERPC_BIND_REASON_ASYNTAX);
155 + return dcesrv_alter_resp(call,
156 + DCERPC_BIND_ACK_RESULT_ACCEPTANCE,
157 + DCERPC_BIND_ACK_REASON_NOT_SPECIFIED);
161 possibly save the call for inspection with ndrdump
163 static void dcesrv_save_call(struct dcesrv_call_state *call, const char *why)
165 2.2.0.rc0.207.ga3a616c