s3:smbXsrv_session: clear smb2req->session of pending requests in smbXsrv_session_log...
authorStefan Metzmacher <metze@samba.org>
Sat, 2 May 2015 14:17:34 +0000 (16:17 +0200)
committerJeremy Allison <jra@samba.org>
Wed, 6 May 2015 20:33:19 +0000 (22:33 +0200)
smbXsrv_session_logoff_all_callback() is called when the last transport
connection is gone, which means we won't need to sign any response...

Bug: https://bugzilla.samba.org/show_bug.cgi?id=11182

Signed-off-by: Stefan Metzmacher <metze@samba.org>
Reviewed-by: Jeremy Allison <jra@samba.org>
source3/smbd/smbXsrv_session.c

index 41625fce8580d5f8ce1c0e8070e31ad1e8e27662..5ee4bbe3f8203e3a8709d86d458bc536b2b3d85d 100644 (file)
@@ -1503,6 +1503,7 @@ static int smbXsrv_session_logoff_all_callback(struct db_record *local_rec,
        TDB_DATA val;
        void *ptr = NULL;
        struct smbXsrv_session *session = NULL;
+       struct smbXsrv_connection *xconn = NULL;
        NTSTATUS status;
 
        val = dbwrap_record_get_value(local_rec);
@@ -1519,6 +1520,28 @@ static int smbXsrv_session_logoff_all_callback(struct db_record *local_rec,
        session = talloc_get_type_abort(ptr, struct smbXsrv_session);
 
        session->db_rec = local_rec;
+
+       if (session->client != NULL) {
+               xconn = session->client->connections;
+       }
+       for (; xconn != NULL; xconn = xconn->next) {
+               struct smbd_smb2_request *preq;
+
+               for (preq = xconn->smb2.requests; preq != NULL; preq = preq->next) {
+                       if (preq->session != session) {
+                               continue;
+                       }
+
+                       preq->session = NULL;
+                       /*
+                        * If we no longer have a session we can't
+                        * sign or encrypt replies.
+                        */
+                       preq->do_signing = false;
+                       preq->do_encryption = false;
+               }
+       }
+
        status = smbXsrv_session_logoff(session);
        if (!NT_STATUS_IS_OK(status)) {
                if (NT_STATUS_IS_OK(state->first_status)) {