Commit c2b77f42 authored by Shuhao Fu's avatar Shuhao Fu Committed by Steve French
Browse files

smb: client: Fix refcount leak for cifs_sb_tlink



Fix three refcount inconsistency issues related to `cifs_sb_tlink`.

Comments for `cifs_sb_tlink` state that `cifs_put_tlink()` needs to be
called after successful calls to `cifs_sb_tlink()`. Three calls fail to
update refcount accordingly, leading to possible resource leaks.

Fixes: 8ceb9843 ("CIFS: Move rename to ops struct")
Fixes: 2f1afe25 ("cifs: Use smb 2 - 3 and cifsacl mount options getacl functions")
Fixes: 366ed846 ("cifs: Use smb 2 - 3 and cifsacl mount options setacl function")
Cc: stable@vger.kernel.org
Signed-off-by: default avatarShuhao Fu <sfual@cse.ust.hk>
Signed-off-by: default avatarSteve French <stfrench@microsoft.com>
parent d451a0e8
Loading
Loading
Loading
Loading
+4 −2
Original line number Diff line number Diff line
@@ -2431,8 +2431,10 @@ cifs_do_rename(const unsigned int xid, struct dentry *from_dentry,
	tcon = tlink_tcon(tlink);
	server = tcon->ses->server;

	if (!server->ops->rename)
		return -ENOSYS;
	if (!server->ops->rename) {
		rc = -ENOSYS;
		goto do_rename_exit;
	}

	/* try path-based rename first */
	rc = server->ops->rename(xid, tcon, from_dentry,
+4 −4
Original line number Diff line number Diff line
@@ -3212,8 +3212,7 @@ get_smb2_acl_by_path(struct cifs_sb_info *cifs_sb,
	utf16_path = cifs_convert_path_to_utf16(path, cifs_sb);
	if (!utf16_path) {
		rc = -ENOMEM;
		free_xid(xid);
		return ERR_PTR(rc);
		goto put_tlink;
	}

	oparms = (struct cifs_open_parms) {
@@ -3245,6 +3244,7 @@ get_smb2_acl_by_path(struct cifs_sb_info *cifs_sb,
		SMB2_close(xid, tcon, fid.persistent_fid, fid.volatile_fid);
	}

put_tlink:
	cifs_put_tlink(tlink);
	free_xid(xid);

@@ -3285,8 +3285,7 @@ set_smb2_acl(struct smb_ntsd *pnntsd, __u32 acllen,
	utf16_path = cifs_convert_path_to_utf16(path, cifs_sb);
	if (!utf16_path) {
		rc = -ENOMEM;
		free_xid(xid);
		return rc;
		goto put_tlink;
	}

	oparms = (struct cifs_open_parms) {
@@ -3307,6 +3306,7 @@ set_smb2_acl(struct smb_ntsd *pnntsd, __u32 acllen,
		SMB2_close(xid, tcon, fid.persistent_fid, fid.volatile_fid);
	}

put_tlink:
	cifs_put_tlink(tlink);
	free_xid(xid);
	return rc;