]>
Commit | Line | Data |
---|---|---|
3d62e122 JB |
1 | From 8c05ae93755a6f0f9887dd99f6356d488e337329 Mon Sep 17 00:00:00 2001 |
2 | From: Julien Kerihuel <j.kerihuel@openchange.org> | |
3 | Date: Tue, 24 Mar 2015 21:06:03 -0700 | |
4 | Subject: [PATCH] Add multiplex state to dcerpc flags and control over | |
5 | multiplex PFC flag in bind_ack and and dcesrv_alter replies | |
6 | ||
7 | Signed-off-by: Julien Kerihuel <j.kerihuel@openchange.org> | |
8 | Reviewed-by: "Stefan (metze) Metzmacher" <metze@samba.org> | |
9 | Reviewed-by: Jelmer Vernooij <jelmer@samba.org> | |
10 | (cherry picked from commit caaf89e899c2a3926fb9e54d1c86f1a9cd5d7618) | |
11 | --- | |
12 | source4/rpc_server/dcerpc_server.c | 15 ++++++++++++++- | |
13 | source4/rpc_server/dcerpc_server.h | 1 + | |
14 | 2 files changed, 15 insertions(+), 1 deletion(-) | |
15 | ||
16 | diff --git a/source4/rpc_server/dcerpc_server.c b/source4/rpc_server/dcerpc_server.c | |
17 | index 4d5e166..4681e17 100644 | |
18 | --- a/source4/rpc_server/dcerpc_server.c | |
19 | +++ b/source4/rpc_server/dcerpc_server.c | |
20 | @@ -614,6 +614,12 @@ static NTSTATUS dcesrv_bind(struct dcesrv_call_state *call) | |
21 | call->conn->cli_max_recv_frag = MIN(0x2000, call->pkt.u.bind.max_recv_frag); | |
22 | } | |
23 | ||
24 | + if ((call->pkt.pfc_flags & DCERPC_PFC_FLAG_CONC_MPX) && | |
25 | + (call->state_flags & DCESRV_CALL_STATE_FLAG_MULTIPLEXED)) { | |
26 | + call->context->conn->state_flags |= DCESRV_CALL_STATE_FLAG_MULTIPLEXED; | |
27 | + extra_flags |= DCERPC_PFC_FLAG_CONC_MPX; | |
28 | + } | |
29 | + | |
30 | /* handle any authentication that is being requested */ | |
31 | if (!dcesrv_auth_bind(call)) { | |
32 | talloc_free(call->context); | |
33 | @@ -793,6 +799,7 @@ static NTSTATUS dcesrv_alter(struct dcesrv_call_state *call) | |
34 | NTSTATUS status; | |
35 | uint32_t result=0, reason=0; | |
36 | uint32_t context_id; | |
37 | + uint32_t extra_flags = 0; | |
38 | ||
39 | /* handle any authentication that is being requested */ | |
40 | if (!dcesrv_auth_alter(call)) { | |
41 | @@ -826,12 +833,18 @@ static NTSTATUS dcesrv_alter(struct dcesrv_call_state *call) | |
42 | reason = DCERPC_BIND_REASON_ASYNTAX; | |
43 | } | |
44 | ||
45 | + if ((call->pkt.pfc_flags & DCERPC_PFC_FLAG_CONC_MPX)) { | |
46 | + if (call->context->conn->state_flags & DCESRV_CALL_STATE_FLAG_MULTIPLEXED) { | |
47 | + extra_flags |= DCERPC_PFC_FLAG_CONC_MPX; | |
48 | + } | |
49 | + } | |
50 | + | |
51 | /* setup a alter_resp */ | |
52 | dcesrv_init_hdr(&pkt, lpcfg_rpc_big_endian(call->conn->dce_ctx->lp_ctx)); | |
53 | pkt.auth_length = 0; | |
54 | pkt.call_id = call->pkt.call_id; | |
55 | pkt.ptype = DCERPC_PKT_ALTER_RESP; | |
56 | - pkt.pfc_flags = DCERPC_PFC_FLAG_FIRST | DCERPC_PFC_FLAG_LAST; | |
57 | + pkt.pfc_flags = DCERPC_PFC_FLAG_FIRST | DCERPC_PFC_FLAG_LAST | extra_flags; | |
58 | pkt.u.alter_resp.max_xmit_frag = 0x2000; | |
59 | pkt.u.alter_resp.max_recv_frag = 0x2000; | |
60 | if (result == 0) { | |
61 | diff --git a/source4/rpc_server/dcerpc_server.h b/source4/rpc_server/dcerpc_server.h | |
62 | index c5d8632..2346876 100644 | |
63 | --- a/source4/rpc_server/dcerpc_server.h | |
64 | +++ b/source4/rpc_server/dcerpc_server.h | |
65 | @@ -101,6 +101,7 @@ struct dcesrv_call_state { | |
66 | */ | |
67 | #define DCESRV_CALL_STATE_FLAG_ASYNC (1<<0) | |
68 | #define DCESRV_CALL_STATE_FLAG_MAY_ASYNC (1<<1) | |
69 | +#define DCESRV_CALL_STATE_FLAG_MULTIPLEXED (1<<3) | |
70 | uint32_t state_flags; | |
71 | ||
72 | /* the time the request arrived in the server */ | |
73 | -- | |
74 | 1.9.1 | |
75 |