]> git.pld-linux.org Git - packages/samba.git/blob - samba-refactor-dcesrv_alter-function.patch
- bump talloc dep
[packages/samba.git] / samba-refactor-dcesrv_alter-function.patch
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
28 @@ -793,66 +793,31 @@ static NTSTATUS dcesrv_alter_new_context(struct dcesrv_call_state *call, uint32_
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 -
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 -
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 +               }
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 +               }
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
This page took 0.046547 seconds and 3 git commands to generate.