TODO anon? s3:smb3_sesssetup: close the previous SMB2 session if requested and allowed
authorStefan Metzmacher <metze@samba.org>
Thu, 26 Apr 2012 15:36:44 +0000 (17:36 +0200)
committerStefan Metzmacher <metze@samba.org>
Wed, 16 May 2012 06:10:24 +0000 (08:10 +0200)
metze

source3/smbd/smb2_sesssetup.c

index ebe1068e46d2bf37983d61f6eda6f66af2861ab8..bf7001938a57abe3c004d32f50511a1537092985 100644 (file)
@@ -306,6 +306,43 @@ static NTSTATUS smbd_smb2_auth_generic_return(struct smbXsrv_session *session,
                session->global->auth_session_info_seqnum;
        session->global->expiration_time = gensec_expire_time(session->gensec);
 
                session->global->auth_session_info_seqnum;
        session->global->expiration_time = gensec_expire_time(session->gensec);
 
+       if ((in_previous_session_id != 0) &&
+            (session->global->session_wire_id !=
+             in_previous_session_id))
+       {
+               struct tevent_context *ev;
+               struct tevent_req *subreq;
+               bool ok;
+
+               ev = event_context_init(talloc_tos());
+               if (ev == NULL) {
+                       TALLOC_FREE(session);
+                       return NT_STATUS_LOGON_FAILURE;
+               }
+
+               subreq = smb2srv_session_close_previous_send(smb2req, ev,
+                                                            session,
+                                                            in_previous_session_id);
+               if (subreq == NULL) {
+                       TALLOC_FREE(session);
+                       return NT_STATUS_LOGON_FAILURE;
+               }
+
+               ok = tevent_req_poll_ntstatus(subreq, ev, &status);
+               if (!ok) {
+                       TALLOC_FREE(subreq);
+                       TALLOC_FREE(session);
+                       return status;
+               }
+
+               status = smb2srv_session_close_previous_recv(subreq);
+               TALLOC_FREE(subreq);
+               if (!NT_STATUS_IS_OK(status)) {
+                       TALLOC_FREE(session);
+                       return status;
+               }
+       }
+
        status = smbXsrv_session_update(session);
        if (!NT_STATUS_IS_OK(status)) {
                DEBUG(0, ("smb2: Failed to update session for vuid=%d - %s\n",
        status = smbXsrv_session_update(session);
        if (!NT_STATUS_IS_OK(status)) {
                DEBUG(0, ("smb2: Failed to update session for vuid=%d - %s\n",