]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
cifs: Fix connections leak when tlink setup failed
authorZhang Xiaoxu <zhangxiaoxu5@huawei.com>
Fri, 11 Nov 2022 07:12:12 +0000 (15:12 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sat, 26 Nov 2022 08:27:33 +0000 (09:27 +0100)
[ Upstream commit 1dcdf5f5b2137185cbdd5385f29949ab3da4f00c ]

If the tlink setup failed, lost to put the connections, then
the module refcnt leak since the cifsd kthread not exit.

Also leak the fscache info, and for next mount with fsc, it will
print the follow errors:
  CIFS: Cache volume key already in use (cifs,127.0.0.1:445,TEST)

Let's check the result of tlink setup, and do some cleanup.

Fixes: 56c762eb9bee ("cifs: Refactor out cifs_mount()")
Reviewed-by: Paulo Alcantara (SUSE) <pc@cjr.nz>
Signed-off-by: Zhang Xiaoxu <zhangxiaoxu5@huawei.com>
Signed-off-by: Steve French <stfrench@microsoft.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
fs/cifs/connect.c

index c2c36451a88378a8640e67378d48b39b71ecd6d8..317ca1be9c4c01fbe047c59eafe91c37ae29b0e2 100644 (file)
@@ -3846,9 +3846,13 @@ int cifs_mount(struct cifs_sb_info *cifs_sb, struct smb3_fs_context *ctx)
        uuid_copy(&cifs_sb->dfs_mount_id, &mnt_ctx.mount_id);
 
 out:
-       free_xid(mnt_ctx.xid);
        cifs_try_adding_channels(cifs_sb, mnt_ctx.ses);
-       return mount_setup_tlink(cifs_sb, mnt_ctx.ses, mnt_ctx.tcon);
+       rc = mount_setup_tlink(cifs_sb, mnt_ctx.ses, mnt_ctx.tcon);
+       if (rc)
+               goto error;
+
+       free_xid(mnt_ctx.xid);
+       return rc;
 
 error:
        dfs_cache_put_refsrv_sessions(&mnt_ctx.mount_id);
@@ -3875,8 +3879,12 @@ int cifs_mount(struct cifs_sb_info *cifs_sb, struct smb3_fs_context *ctx)
                        goto error;
        }
 
+       rc = mount_setup_tlink(cifs_sb, mnt_ctx.ses, mnt_ctx.tcon);
+       if (rc)
+               goto error;
+
        free_xid(mnt_ctx.xid);
-       return mount_setup_tlink(cifs_sb, mnt_ctx.ses, mnt_ctx.tcon);
+       return rc;
 
 error:
        mount_put_conns(&mnt_ctx);