s3:sesssetup: use session->pending_auth in smb1 session setup
authorMichael Adam <obnox@samba.org>
Thu, 30 Jul 2015 11:23:45 +0000 (13:23 +0200)
committerMichael Adam <obnox@samba.org>
Thu, 30 Jul 2015 19:58:14 +0000 (21:58 +0200)
(instead of session->gensec)

Signed-off-by: Michael Adam <obnox@samba.org>
Reviewed-by: Stefan Metzmacher <metze@samba.org>
source3/smbd/sesssetup.c

index d68bcb68cc62eeb5562863d520442b9e2429bcd1..6c31958e448a615fd897058931c99ad0ba9013fa 100644 (file)
@@ -138,6 +138,7 @@ static void reply_sesssetup_and_X_spnego(struct smb_request *req)
        struct smbXsrv_session *session = NULL;
        uint16_t smb_bufsize = SVAL(req->vwv+2, 0);
        uint32_t client_caps = IVAL(req->vwv+10, 0);
+       struct smbXsrv_session_auth0 *auth;
 
        DEBUG(3,("Doing spnego session setup\n"));
 
@@ -216,7 +217,7 @@ static void reply_sesssetup_and_X_spnego(struct smb_request *req)
                if (NT_STATUS_IS_OK(status)) {
                        session->status = NT_STATUS_MORE_PROCESSING_REQUIRED;
                        status = NT_STATUS_MORE_PROCESSING_REQUIRED;
-                       TALLOC_FREE(session->gensec);
+                       TALLOC_FREE(session->pending_auth);
                }
                if (!NT_STATUS_EQUAL(status, NT_STATUS_MORE_PROCESSING_REQUIRED)) {
                        reply_nterror(req, nt_status_squash(status));
@@ -234,19 +235,31 @@ static void reply_sesssetup_and_X_spnego(struct smb_request *req)
                }
        }
 
-       if (!session->gensec) {
+       status = smbXsrv_session_find_auth(session, xconn, now, &auth);
+       if (!NT_STATUS_IS_OK(status)) {
+               status = smbXsrv_session_create_auth(session, xconn, now,
+                                                    0, /* flags */
+                                                    0, /* security */
+                                                    &auth);
+               if (!NT_STATUS_IS_OK(status)) {
+                       reply_nterror(req, nt_status_squash(status));
+                       return;
+               }
+       }
+
+       if (auth->gensec == NULL) {
                status = auth_generic_prepare(session, xconn->remote_address,
-                                             &session->gensec);
+                                             &auth->gensec);
                if (!NT_STATUS_IS_OK(status)) {
                        TALLOC_FREE(session);
                        reply_nterror(req, nt_status_squash(status));
                        return;
                }
 
-               gensec_want_feature(session->gensec, GENSEC_FEATURE_SESSION_KEY);
-               gensec_want_feature(session->gensec, GENSEC_FEATURE_UNIX_TOKEN);
+               gensec_want_feature(auth->gensec, GENSEC_FEATURE_SESSION_KEY);
+               gensec_want_feature(auth->gensec, GENSEC_FEATURE_UNIX_TOKEN);
 
-               status = gensec_start_mech_by_oid(session->gensec,
+               status = gensec_start_mech_by_oid(auth->gensec,
                                                  GENSEC_OID_SPNEGO);
                if (!NT_STATUS_IS_OK(status)) {
                        DEBUG(0, ("Failed to start SPNEGO handler!\n"));
@@ -257,7 +270,7 @@ static void reply_sesssetup_and_X_spnego(struct smb_request *req)
        }
 
        become_root();
-       status = gensec_update(session->gensec,
+       status = gensec_update(auth->gensec,
                               talloc_tos(),
                               in_blob, &out_blob);
        unbecome_root();
@@ -271,7 +284,7 @@ static void reply_sesssetup_and_X_spnego(struct smb_request *req)
        if (NT_STATUS_IS_OK(status) && session->global->auth_session_info == NULL) {
                struct auth_session_info *session_info = NULL;
 
-               status = gensec_session_info(session->gensec,
+               status = gensec_session_info(auth->gensec,
                                             session,
                                             &session_info);
                if (!NT_STATUS_IS_OK(status)) {
@@ -357,7 +370,7 @@ static void reply_sesssetup_and_X_spnego(struct smb_request *req)
                session->global->auth_time = now;
                if (client_caps & CAP_DYNAMIC_REAUTH) {
                        session->global->expiration_time =
-                               gensec_expire_time(session->gensec);
+                               gensec_expire_time(auth->gensec);
                } else {
                        session->global->expiration_time =
                                GENSEC_EXPIRE_TIME_INFINITY;
@@ -397,7 +410,7 @@ static void reply_sesssetup_and_X_spnego(struct smb_request *req)
        } else if (NT_STATUS_IS_OK(status)) {
                struct auth_session_info *session_info = NULL;
 
-               status = gensec_session_info(session->gensec,
+               status = gensec_session_info(auth->gensec,
                                             session,
                                             &session_info);
                if (!NT_STATUS_IS_OK(status)) {
@@ -445,7 +458,7 @@ static void reply_sesssetup_and_X_spnego(struct smb_request *req)
                session->global->auth_time = now;
                if (client_caps & CAP_DYNAMIC_REAUTH) {
                        session->global->expiration_time =
-                               gensec_expire_time(session->gensec);
+                               gensec_expire_time(auth->gensec);
                } else {
                        session->global->expiration_time =
                                GENSEC_EXPIRE_TIME_INFINITY;