cifs: protect session status check in smb2_reconnect()
authorPaulo Alcantara <pc@manguebit.com>
Thu, 27 Apr 2023 19:07:38 +0000 (16:07 -0300)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 11 May 2023 14:03:41 +0000 (23:03 +0900)
commit 5bff9f741af60b143a5ae73417a8ec47fd5ff2f4 upstream.

Use @ses->ses_lock to protect access of @ses->ses_status.

Cc: stable@vger.kernel.org
Signed-off-by: Paulo Alcantara (SUSE) <pc@manguebit.com>
Signed-off-by: Steve French <stfrench@microsoft.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
fs/cifs/smb2pdu.c

index ab59faf..537e867 100644 (file)
@@ -175,8 +175,17 @@ smb2_reconnect(__le16 smb2_command, struct cifs_tcon *tcon,
                }
        }
        spin_unlock(&tcon->tc_lock);
-       if ((!tcon->ses) || (tcon->ses->ses_status == SES_EXITING) ||
-           (!tcon->ses->server) || !server)
+
+       ses = tcon->ses;
+       if (!ses)
+               return -EIO;
+       spin_lock(&ses->ses_lock);
+       if (ses->ses_status == SES_EXITING) {
+               spin_unlock(&ses->ses_lock);
+               return -EIO;
+       }
+       spin_unlock(&ses->ses_lock);
+       if (!ses->server || !server)
                return -EIO;
 
        spin_lock(&server->srv_lock);
@@ -204,8 +213,6 @@ again:
        if (rc)
                return rc;
 
-       ses = tcon->ses;
-
        spin_lock(&ses->chan_lock);
        if (!cifs_chan_needs_reconnect(ses, server) && !tcon->need_reconnect) {
                spin_unlock(&ses->chan_lock);