]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
s4:rpc_server: introduce call->ack_pkt and avoid pkt variable for the response on...
authorStefan Metzmacher <metze@samba.org>
Mon, 15 May 2017 12:15:41 +0000 (14:15 +0200)
committerAndrew Bartlett <abartlet@samba.org>
Sun, 21 May 2017 19:05:12 +0000 (21:05 +0200)
This will be needed when we use async authentication using gensec_update_send/recv.

Signed-off-by: Stefan Metzmacher <metze@samba.org>
Reviewed-by: Andrew Bartlett <abartlet@samba.org>
source4/rpc_server/dcerpc_server.c
source4/rpc_server/dcerpc_server.h

index 9f62c115b5f98191eb243a74e88252deea36a1d4..a9f8854a91efc315f9ed0915a30a256ea27888ca 100644 (file)
@@ -773,7 +773,7 @@ _PUBLIC_ NTSTATUS dcesrv_interface_bind_allow_connect(struct dcesrv_call_state *
 */
 static NTSTATUS dcesrv_bind(struct dcesrv_call_state *call)
 {
-       struct ncacn_packet pkt;
+       struct ncacn_packet *pkt = &call->ack_pkt;
        struct data_blob_list_item *rep;
        NTSTATUS status;
        uint32_t extra_flags = 0;
@@ -984,14 +984,14 @@ static NTSTATUS dcesrv_bind(struct dcesrv_call_state *call)
        }
 
        /* setup a bind_ack */
-       dcesrv_init_hdr(&pkt, lpcfg_rpc_big_endian(call->conn->dce_ctx->lp_ctx));
-       pkt.auth_length = 0;
-       pkt.call_id = call->pkt.call_id;
-       pkt.ptype = DCERPC_PKT_BIND_ACK;
-       pkt.pfc_flags = DCERPC_PFC_FLAG_FIRST | DCERPC_PFC_FLAG_LAST | extra_flags;
-       pkt.u.bind_ack.max_xmit_frag = call->conn->max_xmit_frag;
-       pkt.u.bind_ack.max_recv_frag = call->conn->max_recv_frag;
-       pkt.u.bind_ack.assoc_group_id = call->conn->assoc_group->id;
+       dcesrv_init_hdr(pkt, lpcfg_rpc_big_endian(call->conn->dce_ctx->lp_ctx));
+       pkt->auth_length = 0;
+       pkt->call_id = call->pkt.call_id;
+       pkt->ptype = DCERPC_PKT_BIND_ACK;
+       pkt->pfc_flags = DCERPC_PFC_FLAG_FIRST | DCERPC_PFC_FLAG_LAST | extra_flags;
+       pkt->u.bind_ack.max_xmit_frag = call->conn->max_xmit_frag;
+       pkt->u.bind_ack.max_recv_frag = call->conn->max_recv_frag;
+       pkt->u.bind_ack.assoc_group_id = call->conn->assoc_group->id;
 
        endpoint = dcerpc_binding_get_string_option(
                                call->conn->endpoint->ep_description,
@@ -1010,18 +1010,18 @@ static NTSTATUS dcesrv_bind(struct dcesrv_call_state *call)
                endpoint += 6;
        }
 
-       pkt.u.bind_ack.secondary_address = talloc_asprintf(call, "%s%s",
+       pkt->u.bind_ack.secondary_address = talloc_asprintf(call, "%s%s",
                                                           ep_prefix,
                                                           endpoint);
-       if (pkt.u.bind_ack.secondary_address == NULL) {
+       if (pkt->u.bind_ack.secondary_address == NULL) {
                TALLOC_FREE(call->context);
                return NT_STATUS_NO_MEMORY;
        }
-       pkt.u.bind_ack.num_results = call->pkt.u.bind.num_contexts;
-       pkt.u.bind_ack.ctx_list = ack_ctx_list;
-       pkt.u.bind_ack.auth_info = data_blob_null;
+       pkt->u.bind_ack.num_results = call->pkt.u.bind.num_contexts;
+       pkt->u.bind_ack.ctx_list = ack_ctx_list;
+       pkt->u.bind_ack.auth_info = data_blob_null;
 
-       status = dcesrv_auth_bind_ack(call, &pkt);
+       status = dcesrv_auth_bind_ack(call, pkt);
        if (!NT_STATUS_IS_OK(status)) {
                TALLOC_FREE(call->context);
                return dcesrv_bind_nak(call, 0);
@@ -1033,7 +1033,7 @@ static NTSTATUS dcesrv_bind(struct dcesrv_call_state *call)
                return NT_STATUS_NO_MEMORY;
        }
 
-       status = ncacn_push_auth(&rep->blob, call, &pkt,
+       status = ncacn_push_auth(&rep->blob, call, pkt,
                                 call->out_auth_info);
        if (!NT_STATUS_IS_OK(status)) {
                TALLOC_FREE(call->context);
@@ -1337,7 +1337,7 @@ static NTSTATUS dcesrv_alter(struct dcesrv_call_state *call)
 {
        NTSTATUS status;
        bool auth_ok = false;
-       struct ncacn_packet pkt;
+       struct ncacn_packet *pkt = &call->ack_pkt;
        uint32_t extra_flags = 0;
        struct data_blob_list_item *rep = NULL;
        struct dcerpc_ack_ctx *ack_ctx_list = NULL;
@@ -1430,20 +1430,20 @@ static NTSTATUS dcesrv_alter(struct dcesrv_call_state *call)
                return dcesrv_fault_disconnect(call, DCERPC_FAULT_ACCESS_DENIED);
        }
 
-       dcesrv_init_hdr(&pkt, lpcfg_rpc_big_endian(call->conn->dce_ctx->lp_ctx));
-       pkt.auth_length = 0;
-       pkt.call_id = call->pkt.call_id;
-       pkt.ptype = DCERPC_PKT_ALTER_RESP;
-       pkt.pfc_flags = DCERPC_PFC_FLAG_FIRST | DCERPC_PFC_FLAG_LAST | extra_flags;
-       pkt.u.alter_resp.max_xmit_frag = call->conn->max_xmit_frag;
-       pkt.u.alter_resp.max_recv_frag = call->conn->max_recv_frag;
-       pkt.u.alter_resp.assoc_group_id = call->conn->assoc_group->id;
-       pkt.u.alter_resp.secondary_address = "";
-       pkt.u.alter_resp.num_results = call->pkt.u.alter.num_contexts;
-       pkt.u.alter_resp.ctx_list = ack_ctx_list;
-       pkt.u.alter_resp.auth_info = data_blob_null;
-
-       status = dcesrv_auth_alter_ack(call, &pkt);
+       dcesrv_init_hdr(pkt, lpcfg_rpc_big_endian(call->conn->dce_ctx->lp_ctx));
+       pkt->auth_length = 0;
+       pkt->call_id = call->pkt.call_id;
+       pkt->ptype = DCERPC_PKT_ALTER_RESP;
+       pkt->pfc_flags = DCERPC_PFC_FLAG_FIRST | DCERPC_PFC_FLAG_LAST | extra_flags;
+       pkt->u.alter_resp.max_xmit_frag = call->conn->max_xmit_frag;
+       pkt->u.alter_resp.max_recv_frag = call->conn->max_recv_frag;
+       pkt->u.alter_resp.assoc_group_id = call->conn->assoc_group->id;
+       pkt->u.alter_resp.secondary_address = "";
+       pkt->u.alter_resp.num_results = call->pkt.u.alter.num_contexts;
+       pkt->u.alter_resp.ctx_list = ack_ctx_list;
+       pkt->u.alter_resp.auth_info = data_blob_null;
+
+       status = dcesrv_auth_alter_ack(call, pkt);
        if (!NT_STATUS_IS_OK(status)) {
                return dcesrv_fault_disconnect(call, DCERPC_FAULT_SEC_PKG_ERROR);
        }
@@ -1453,7 +1453,7 @@ static NTSTATUS dcesrv_alter(struct dcesrv_call_state *call)
                return NT_STATUS_NO_MEMORY;
        }
 
-       status = ncacn_push_auth(&rep->blob, call, &pkt, call->out_auth_info);
+       status = ncacn_push_auth(&rep->blob, call, pkt, call->out_auth_info);
        if (!NT_STATUS_IS_OK(status)) {
                return status;
        }
index 89377ab9e7dd0902967ecf155d4b2657a9c68c68..9a643415b0c4a2e17d9a1f2951aafa86f69fc355 100644 (file)
@@ -92,6 +92,11 @@ struct dcesrv_call_state {
        struct dcesrv_connection_context *context;
        struct ncacn_packet pkt;
 
+       /*
+        * Used during async bind/alter_context.
+        */
+       struct ncacn_packet ack_pkt;
+
        /*
          which list this request is in, if any
         */