| From b05e8b12d2c3f4bf1f3a8287b1ea4f3954b4a742 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Thu, 24 Jun 2021 15:28:04 -0500 |
| Subject: cifs: fix missing spinlock around update to ses->status |
| |
| From: Steve French <stfrench@microsoft.com> |
| |
| [ Upstream commit 0060a4f28a9ef45ae8163c0805e944a2b1546762 ] |
| |
| In the other places where we update ses->status we protect the |
| updates via GlobalMid_Lock. So to be consistent add the same |
| locking around it in cifs_put_smb_ses where it was missing. |
| |
| Addresses-Coverity: 1268904 ("Data race condition") |
| Signed-off-by: Steve French <stfrench@microsoft.com> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| fs/cifs/cifsglob.h | 3 ++- |
| fs/cifs/connect.c | 5 ++++- |
| 2 files changed, 6 insertions(+), 2 deletions(-) |
| |
| diff --git a/fs/cifs/cifsglob.h b/fs/cifs/cifsglob.h |
| index 248ee81e0151..6599069be690 100644 |
| --- a/fs/cifs/cifsglob.h |
| +++ b/fs/cifs/cifsglob.h |
| @@ -979,7 +979,7 @@ struct cifs_ses { |
| struct mutex session_mutex; |
| struct TCP_Server_Info *server; /* pointer to server info */ |
| int ses_count; /* reference counter */ |
| - enum statusEnum status; |
| + enum statusEnum status; /* updates protected by GlobalMid_Lock */ |
| unsigned overrideSecFlg; /* if non-zero override global sec flags */ |
| char *serverOS; /* name of operating system underlying server */ |
| char *serverNOS; /* name of network operating system of server */ |
| @@ -1863,6 +1863,7 @@ require use of the stronger protocol */ |
| * list operations on pending_mid_q and oplockQ |
| * updates to XID counters, multiplex id and SMB sequence numbers |
| * list operations on global DnotifyReqList |
| + * updates to ses->status |
| * tcp_ses_lock protects: |
| * list operations on tcp and SMB session lists |
| * tcon->open_file_lock protects the list of open files hanging off the tcon |
| diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c |
| index aabaebd1535f..fb7088d57e46 100644 |
| --- a/fs/cifs/connect.c |
| +++ b/fs/cifs/connect.c |
| @@ -2829,9 +2829,12 @@ void cifs_put_smb_ses(struct cifs_ses *ses) |
| spin_unlock(&cifs_tcp_ses_lock); |
| return; |
| } |
| + spin_unlock(&cifs_tcp_ses_lock); |
| + |
| + spin_lock(&GlobalMid_Lock); |
| if (ses->status == CifsGood) |
| ses->status = CifsExiting; |
| - spin_unlock(&cifs_tcp_ses_lock); |
| + spin_unlock(&GlobalMid_Lock); |
| |
| cifs_free_ipc(ses); |
| |
| -- |
| 2.30.2 |
| |