]>
Commit | Line | Data |
---|---|---|
3d62e122 JB |
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 | |
5 | steps. | |
6 | ||
7 | Fixes bug: | |
8 | ||
9 | https://bugzilla.samba.org/show_bug.cgi?id=11236 | |
10 | ||
11 | Based on code from Julien Kerihuel <j.kerihuel@openchange.org> | |
12 | ||
13 | Signed-off-by: Jeremy Allison <jra@samba.org> | |
14 | Reviewed-by: Andreas Schneider <asn@samba.org> | |
15 | ||
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 | |
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 | ||
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 | |
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 | -- | |
165 | 2.2.0.rc0.207.ga3a616c | |
166 |