Unverified Commit 10dcd511 authored by Jeff Layton's avatar Jeff Layton Committed by Christian Brauner
Browse files

nfs: properly disallow delegation requests on directories



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: e6d28ebc ("filelock: push the S_ISREG check down to ->setlease handlers")
Reported-by: default avatarChristoph Hellwig <hch@infradead.org>
Closes: https://lore.kernel.org/linux-fsdevel/aV316LhsVSl0n9-E@infradead.org/


Signed-off-by: default avatarJeff Layton <jlayton@kernel.org>
Link: https://patch.msgid.link/20260107-setlease-6-19-v1-1-85f034abcc57@kernel.org


Tested-by: default avatarChristoph Hellwig <hch@lst.de>
Signed-off-by: default avatarChristian Brauner <brauner@kernel.org>
parent cab01237
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -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 = {
+0 −2
Original line number Diff line number Diff line
@@ -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);
}