]> git.pld-linux.org Git - packages/samba.git/blame - samba-refactor-dcesrv_alter-function.patch
- added one more dcerpc patch from 4.2.next (pending call support)
[packages/samba.git] / samba-refactor-dcesrv_alter-function.patch
CommitLineData
3d62e122
JB
1From 4b942ee95cc351e4b123f57197ef19c79ae2b0aa Mon Sep 17 00:00:00 2001
2From: Jeremy Allison <jra@samba.org>
3Date: Fri, 24 Apr 2015 13:19:30 -0700
4Subject: [PATCH] s4: rpc: Refactor dcesrv_alter() function into setup and send
5 steps.
6
7Fixes bug:
8
9https://bugzilla.samba.org/show_bug.cgi?id=11236
10
11Based on code from Julien Kerihuel <j.kerihuel@openchange.org>
12
13Signed-off-by: Jeremy Allison <jra@samba.org>
14Reviewed-by: Andreas Schneider <asn@samba.org>
15
16Autobuild-User(master): Jeremy Allison <jra@samba.org>
17Autobuild-Date(master): Sat Apr 25 02:43:22 CEST 2015 on sn-devel-104
18
19(cherry picked from commit 49030649db3dfec5a9bc03e5dde4255a14499f16)
20---
21 source4/rpc_server/dcerpc_server.c | 114 ++++++++++++++++++++-----------------
22 1 file changed, 62 insertions(+), 52 deletions(-)
23
24diff --git a/source4/rpc_server/dcerpc_server.c b/source4/rpc_server/dcerpc_server.c
25index f25aa68..b1c763b 100644
26--- a/source4/rpc_server/dcerpc_server.c
27+++ b/source4/rpc_server/dcerpc_server.c
0c2036ad 28@@ -793,66 +793,31 @@ static NTSTATUS dcesrv_alter_new_context(struct dcesrv_call_state *call, uint32_
3d62e122
JB
29 return NT_STATUS_OK;
30 }
31
32-
33-/*
34- handle a alter context request
35-*/
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,
39+ uint32_t result,
40+ uint32_t reason)
41 {
42 struct ncacn_packet pkt;
43- struct data_blob_list_item *rep;
44- NTSTATUS status;
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;
49+ NTSTATUS status;
50
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;
56- }
57-
58- context_id = call->pkt.u.alter.ctx_list[0].context_id;
59-
60- /* see if they are asking for a new interface */
61- if (result == 0) {
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;
68- }
69- }
70- }
71-
72- if (result == 0 &&
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;
81- }
82-
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;
86- }
87- }
88-
0c2036ad
JB
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;
91- }
92-
3d62e122
JB
93- /* setup a alter_resp */
94 dcesrv_init_hdr(&pkt, lpcfg_rpc_big_endian(call->conn->dce_ctx->lp_ctx));
95 pkt.auth_length = 0;
96 pkt.call_id = call->pkt.call_id;
97 pkt.ptype = DCERPC_PKT_ALTER_RESP;
98+ if (result == 0) {
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;
103+ }
0c2036ad
JB
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;
107+ }
3d62e122
JB
108+ }
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)
113 }
114
115 /*
116+ handle a alter context request
117+*/
118+static NTSTATUS dcesrv_alter(struct dcesrv_call_state *call)
119+{
120+ NTSTATUS status;
121+ uint32_t context_id;
122+
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);
129+ }
130+
131+ context_id = call->pkt.u.alter.ctx_list[0].context_id;
132+
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);
141+ }
142+ }
143+
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);
153+ }
154+
155+ return dcesrv_alter_resp(call,
156+ DCERPC_BIND_ACK_RESULT_ACCEPTANCE,
157+ DCERPC_BIND_ACK_REASON_NOT_SPECIFIED);
158+}
159+
160+/*
161 possibly save the call for inspection with ndrdump
162 */
163 static void dcesrv_save_call(struct dcesrv_call_state *call, const char *why)
164--
1652.2.0.rc0.207.ga3a616c
166
This page took 0.111409 seconds and 4 git commands to generate.