]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
smb/client: properly disallow delegations on directories
authorJeff Layton <jlayton@kernel.org>
Wed, 7 Jan 2026 14:20:10 +0000 (09:20 -0500)
committerChristian Brauner <brauner@kernel.org>
Mon, 12 Jan 2026 09:54:47 +0000 (10:54 +0100)
The check for S_ISREG() in cifs_setlease() is incorrect since that
operation doesn't get called for directories. The correct way to prevent
delegations on directories is to set the ->setlease() method in directory
file_operations to simple_nosetlease().

Fixes: e6d28ebc17eb ("filelock: push the S_ISREG check down to ->setlease handlers")
Signed-off-by: Jeff Layton <jlayton@kernel.org>
Link: https://patch.msgid.link/20260107-setlease-6-19-v1-2-85f034abcc57@kernel.org
Signed-off-by: Christian Brauner <brauner@kernel.org>
fs/smb/client/cifsfs.c

index d9664634144d3ebba5cdd659f651d6e6e8f975fa..a3dc7cb1ab541d35c2e43eefb7a2d2d23ad88bb3 100644 (file)
@@ -1149,9 +1149,6 @@ cifs_setlease(struct file *file, int arg, struct file_lease **lease, void **priv
        struct inode *inode = file_inode(file);
        struct cifsFileInfo *cfile = file->private_data;
 
-       if (!S_ISREG(inode->i_mode))
-               return -EINVAL;
-
        /* Check if file is oplocked if this is request for new lease */
        if (arg == F_UNLCK ||
            ((arg == F_RDLCK) && CIFS_CACHE_READ(CIFS_I(inode))) ||
@@ -1712,6 +1709,7 @@ const struct file_operations cifs_dir_ops = {
        .remap_file_range = cifs_remap_file_range,
        .llseek = generic_file_llseek,
        .fsync = cifs_dir_fsync,
+       .setlease = simple_nosetlease,
 };
 
 static void