cifs: Fix xid leak in cifs_flock()
authorZhang Xiaoxu <zhangxiaoxu5@huawei.com>
Mon, 17 Oct 2022 14:45:23 +0000 (22:45 +0800)
committerSteve French <stfrench@microsoft.com>
Tue, 18 Oct 2022 16:33:43 +0000 (11:33 -0500)
If not flock, before return -ENOLCK, should free the xid,
otherwise, the xid will be leaked.

Fixes: d0677992d2af ("cifs: add support for flock")
Reviewed-by: Paulo Alcantara (SUSE) <pc@cjr.nz>
Signed-off-by: Zhang Xiaoxu <zhangxiaoxu5@huawei.com>
Signed-off-by: Steve French <stfrench@microsoft.com>
fs/cifs/file.c

index f6ffee5..5b3b308 100644 (file)
@@ -1885,11 +1885,13 @@ int cifs_flock(struct file *file, int cmd, struct file_lock *fl)
        struct cifsFileInfo *cfile;
        __u32 type;
 
-       rc = -EACCES;
        xid = get_xid();
 
-       if (!(fl->fl_flags & FL_FLOCK))
-               return -ENOLCK;
+       if (!(fl->fl_flags & FL_FLOCK)) {
+               rc = -ENOLCK;
+               free_xid(xid);
+               return rc;
+       }
 
        cfile = (struct cifsFileInfo *)file->private_data;
        tcon = tlink_tcon(cfile->tlink);
@@ -1908,8 +1910,9 @@ int cifs_flock(struct file *file, int cmd, struct file_lock *fl)
                 * if no lock or unlock then nothing to do since we do not
                 * know what it is
                 */
+               rc = -EOPNOTSUPP;
                free_xid(xid);
-               return -EOPNOTSUPP;
+               return rc;
        }
 
        rc = cifs_setlk(file, fl, type, wait_flag, posix_lck, lock, unlock,