s4:rpc_server: make use of dcesrv_auth_prepare_alter_ack() in dcesrv_alter()
authorStefan Metzmacher <metze@samba.org>
Mon, 15 May 2017 12:02:07 +0000 (14:02 +0200)
committerAndrew Bartlett <abartlet@samba.org>
Sun, 21 May 2017 19:05:13 +0000 (21:05 +0200)
It means we also need to call gensec_update_ev() and dcesrv_auth_complete()
directly in dcesrv_alter(). Doing that will make it easier to make dcesrv_alter()
async in the next commits.

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

index 2f322ceadb6f2d13f489aea0765340e5236c0cd8..c650c6397b7b7570e832adbf73e08ec405928abd 100644 (file)
@@ -1357,6 +1357,7 @@ static NTSTATUS dcesrv_alter(struct dcesrv_call_state *call)
        bool auth_ok = false;
        struct ncacn_packet *pkt = &call->ack_pkt;
        uint32_t extra_flags = 0;
+       struct dcesrv_auth *auth = &call->conn->auth_state;
        struct dcerpc_ack_ctx *ack_ctx_list = NULL;
        size_t i;
 
@@ -1460,7 +1461,21 @@ static NTSTATUS dcesrv_alter(struct dcesrv_call_state *call)
        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);
+       status = dcesrv_auth_prepare_alter_ack(call, pkt);
+       if (!NT_STATUS_IS_OK(status)) {
+               return dcesrv_fault_disconnect(call, DCERPC_FAULT_SEC_PKG_ERROR);
+       }
+
+       if (auth->auth_finished) {
+               return dcesrv_auth_reply(call);
+       }
+
+       status = gensec_update_ev(auth->gensec_security,
+                                 call, call->event_ctx,
+                                 call->in_auth_info.credentials,
+                                 &call->out_auth_info->credentials);
+
+       status = dcesrv_auth_complete(call, status);
        if (!NT_STATUS_IS_OK(status)) {
                return dcesrv_fault_disconnect(call, DCERPC_FAULT_SEC_PKG_ERROR);
        }