s4:librpc/rpc: make sure the DCERPC_CONCURRENT_MULTIPLEX and DCERPC_PFC_FLAG_CONC_MPX...
authorStefan Metzmacher <metze@samba.org>
Thu, 15 Sep 2016 16:17:44 +0000 (18:17 +0200)
committerAndreas Schneider <asn@cryptomilk.org>
Wed, 26 Oct 2016 09:20:17 +0000 (11:20 +0200)
Signed-off-by: Stefan Metzmacher <metze@samba.org>
Reviewed-by: Andreas Schneider <asn@samba.org>
source4/librpc/rpc/dcerpc.c

index 8a96f01e8a0683b24edad191d187775e03b181f3..7816aca32208ef8e2059e6451368af6c8aa00d76 100644 (file)
@@ -1220,11 +1220,26 @@ static void dcerpc_bind_recv_handler(struct rpc_request *subreq,
 
        flags = dcerpc_binding_get_flags(state->p->binding);
 
-       if ((flags & DCERPC_CONCURRENT_MULTIPLEX) &&
-           (pkt->pfc_flags & DCERPC_PFC_FLAG_CONC_MPX)) {
-               conn->flags |= DCERPC_CONCURRENT_MULTIPLEX;
+       if (flags & DCERPC_CONCURRENT_MULTIPLEX) {
+               if (pkt->pfc_flags & DCERPC_PFC_FLAG_CONC_MPX) {
+                       conn->flags |= DCERPC_CONCURRENT_MULTIPLEX;
+               } else {
+                       conn->flags &= ~DCERPC_CONCURRENT_MULTIPLEX;
+               }
        }
 
+       if (!(conn->flags & DCERPC_CONCURRENT_MULTIPLEX)) {
+               struct dcerpc_binding *pb =
+                       discard_const_p(struct dcerpc_binding, state->p->binding);
+               /*
+                * clear DCERPC_CONCURRENT_MULTIPLEX
+                */
+               status = dcerpc_binding_set_flags(pb, 0,
+                                                 DCERPC_CONCURRENT_MULTIPLEX);
+               if (tevent_req_nterror(req, status)) {
+                       return;
+               }
+       }
        if ((conn->flags & DCERPC_PROPOSE_HEADER_SIGNING) &&
            (pkt->pfc_flags & DCERPC_PFC_FLAG_SUPPORT_HEADER_SIGN)) {
                conn->flags |= DCERPC_HEADER_SIGNING;