auth/spnego: set state_position = SPNEGO_DONE in gensec_spnego_update_cleanup()
authorStefan Metzmacher <metze@samba.org>
Wed, 14 Jun 2017 06:43:13 +0000 (08:43 +0200)
committerAndreas Schneider <asn@cryptomilk.org>
Thu, 29 Jun 2017 13:59:21 +0000 (15:59 +0200)
Every fatal error should mark the spnego_state to reject any further update()
calls.

Signed-off-by: Stefan Metzmacher <metze@samba.org>
Reviewed-by: Andreas Schneider <asn@samba.org>
auth/gensec/spnego.c

index ac1046d15ae67771dc39ec8eb5440fda7599a8a5..cb2c227cd604f56973117bfa5edb1ace7b919271 100644 (file)
@@ -1391,6 +1391,27 @@ struct gensec_spnego_update_state {
        DATA_BLOB out;
 };
 
+static void gensec_spnego_update_cleanup(struct tevent_req *req,
+                                        enum tevent_req_state req_state)
+{
+       struct gensec_spnego_update_state *state =
+               tevent_req_data(req,
+               struct gensec_spnego_update_state);
+
+       switch (req_state) {
+       case TEVENT_REQ_USER_ERROR:
+       case TEVENT_REQ_TIMED_OUT:
+       case TEVENT_REQ_NO_MEMORY:
+               /*
+                * A fatal error, further updates are not allowed.
+                */
+               state->spnego->state_position = SPNEGO_DONE;
+               break;
+       default:
+               break;
+       }
+}
+
 static struct tevent_req *gensec_spnego_update_send(TALLOC_CTX *mem_ctx,
                                                    struct tevent_context *ev,
                                                    struct gensec_security *gensec_security,
@@ -1410,6 +1431,7 @@ static struct tevent_req *gensec_spnego_update_send(TALLOC_CTX *mem_ctx,
        }
        state->gensec = gensec_security;
        state->spnego = spnego_state;
+       tevent_req_set_cleanup_fn(req, gensec_spnego_update_cleanup);
 
        if (spnego_state->out_frag.length > 0) {
                if (in.length > 0) {
@@ -1459,10 +1481,6 @@ static struct tevent_req *gensec_spnego_update_send(TALLOC_CTX *mem_ctx,
        }
        if (!NT_STATUS_IS_OK(status) &&
            !NT_STATUS_EQUAL(status, NT_STATUS_MORE_PROCESSING_REQUIRED)) {
-               /*
-                * A fatal error, further updates are not allowed.
-                */
-               spnego_state->state_position = SPNEGO_DONE;
                tevent_req_nterror(req, status);
                return tevent_req_post(req, ev);
        }