cifs: missing lock when updating session status
authorSteve French <stfrench@microsoft.com>
Thu, 27 Apr 2023 03:01:31 +0000 (22:01 -0500)
committerSteve French <stfrench@microsoft.com>
Sat, 29 Apr 2023 02:23:42 +0000 (21:23 -0500)
Coverity noted a place where we were not grabbing
the ses_lock when setting (and checking) ses_status.

Addresses-Coverity: 1536833 ("Data race condition (MISSING_LOCK)")
Reviewed-by: Paulo Alcantara (SUSE) <pc@manguebit.com>
Reviewed-by: Bharath SM <bharathsm@microsoft.com>
Signed-off-by: Steve French <stfrench@microsoft.com>
fs/cifs/connect.c

index 1cbb9058799572686193dfa84925d0b03601d5ad..7bfef741f758dd073321d107b5fd3b67b34c9add 100644 (file)
@@ -1916,18 +1916,22 @@ void cifs_put_smb_ses(struct cifs_ses *ses)
        /* ses_count can never go negative */
        WARN_ON(ses->ses_count < 0);
 
+       spin_lock(&ses->ses_lock);
        if (ses->ses_status == SES_GOOD)
                ses->ses_status = SES_EXITING;
 
-       cifs_free_ipc(ses);
-
        if (ses->ses_status == SES_EXITING && server->ops->logoff) {
+               spin_unlock(&ses->ses_lock);
+               cifs_free_ipc(ses);
                xid = get_xid();
                rc = server->ops->logoff(xid, ses);
                if (rc)
                        cifs_server_dbg(VFS, "%s: Session Logoff failure rc=%d\n",
                                __func__, rc);
                _free_xid(xid);
+       } else {
+               spin_unlock(&ses->ses_lock);
+               cifs_free_ipc(ses);
        }
 
        spin_lock(&cifs_tcp_ses_lock);