]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
nfs: properly disallow delegation requests on directories
authorJeff Layton <jlayton@kernel.org>
Wed, 7 Jan 2026 14:20:09 +0000 (09:20 -0500)
committerChristian Brauner <brauner@kernel.org>
Mon, 12 Jan 2026 09:54:46 +0000 (10:54 +0100)
Checking for S_ISREG() in nfs4_setlease() is incorrect, since that op is
never called for directories. The right way to deny lease requests on
directories is to set the ->setlease() operation to simple_nosetlease()
in the directory file_operations.

Fixes: e6d28ebc17eb ("filelock: push the S_ISREG check down to ->setlease handlers")
Reported-by: Christoph Hellwig <hch@infradead.org>
Closes: https://lore.kernel.org/linux-fsdevel/aV316LhsVSl0n9-E@infradead.org/
Signed-off-by: Jeff Layton <jlayton@kernel.org>
Link: https://patch.msgid.link/20260107-setlease-6-19-v1-1-85f034abcc57@kernel.org
Tested-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Christian Brauner <brauner@kernel.org>
fs/nfs/dir.c
fs/nfs/nfs4file.c

index 23a78a742b619dea8b76ddf28f4f59a1c8a015e2..71df279febf797880ded19e45528c3df4cea2dde 100644 (file)
@@ -66,6 +66,7 @@ const struct file_operations nfs_dir_operations = {
        .open           = nfs_opendir,
        .release        = nfs_closedir,
        .fsync          = nfs_fsync_dir,
+       .setlease       = simple_nosetlease,
 };
 
 const struct address_space_operations nfs_dir_aops = {
index 7317f26892c5782a39660cae87ec1afea24e36c0..7f43e890d3564a000dab9365048a3e17dc96395c 100644 (file)
@@ -431,8 +431,6 @@ void nfs42_ssc_unregister_ops(void)
 static int nfs4_setlease(struct file *file, int arg, struct file_lease **lease,
                         void **priv)
 {
-       if (!S_ISREG(file_inode(file)->i_mode))
-               return -EINVAL;
        return nfs4_proc_setlease(file, arg, lease, priv);
 }