cifs: prevent use-after-free by freeing the cfile later
authorShyam Prasad N <sprasad@microsoft.com>
Thu, 22 Jun 2023 18:16:03 +0000 (18:16 +0000)
committerSteve French <stfrench@microsoft.com>
Wed, 28 Jun 2023 16:46:32 +0000 (11:46 -0500)
In smb2_compound_op we have a possible use-after-free
which can cause hard to debug problems later on.

This was revealed during stress testing with KASAN enabled
kernel. Fixing it by moving the cfile free call to
a few lines below, after the usage.

Fixes: 76894f3e2f71 ("cifs: improve symlink handling for smb2+")
Reviewed-by: Paulo Alcantara (SUSE) <pc@manguebit.com>
Signed-off-by: Shyam Prasad N <sprasad@microsoft.com>
Signed-off-by: Steve French <stfrench@microsoft.com>
fs/smb/client/smb2inode.c

index 163a032..7e3ac4c 100644 (file)
@@ -398,9 +398,6 @@ static int smb2_compound_op(const unsigned int xid, struct cifs_tcon *tcon,
                                        rsp_iov);
 
  finished:
-       if (cfile)
-               cifsFileInfo_put(cfile);
-
        SMB2_open_free(&rqst[0]);
        if (rc == -EREMCHG) {
                pr_warn_once("server share %s deleted\n", tcon->tree_name);
@@ -529,6 +526,9 @@ static int smb2_compound_op(const unsigned int xid, struct cifs_tcon *tcon,
                break;
        }
 
+       if (cfile)
+               cifsFileInfo_put(cfile);
+
        if (rc && err_iov && err_buftype) {
                memcpy(err_iov, rsp_iov, 3 * sizeof(*err_iov));
                memcpy(err_buftype, resp_buftype, 3 * sizeof(*err_buftype));