45 lines
1.2 KiB
Diff
45 lines
1.2 KiB
Diff
From: Trond Myklebust <Trond.Myklebust@netapp.com>
|
|
Date: Wed, 18 Apr 2012 12:48:35 -0400
|
|
Subject: [PATCH 2/2] NFSv4: Ensure that we check lock exclusive/shared type
|
|
against open modes
|
|
|
|
commit 55725513b5ef9d462aa3e18527658a0362aaae83 upstream.
|
|
|
|
Since we may be simulating flock() locks using NFS byte range locks,
|
|
we can't rely on the VFS having checked the file open mode for us.
|
|
|
|
Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
|
|
Cc: stable@vger.kernel.org
|
|
---
|
|
fs/nfs/nfs4proc.c | 14 ++++++++++++++
|
|
1 file changed, 14 insertions(+)
|
|
|
|
diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c
|
|
index 3c787d0..ba837d9 100644
|
|
--- a/fs/nfs/nfs4proc.c
|
|
+++ b/fs/nfs/nfs4proc.c
|
|
@@ -4726,6 +4726,20 @@ nfs4_proc_lock(struct file *filp, int cmd, struct file_lock *request)
|
|
|
|
if (state == NULL)
|
|
return -ENOLCK;
|
|
+ /*
|
|
+ * Don't rely on the VFS having checked the file open mode,
|
|
+ * since it won't do this for flock() locks.
|
|
+ */
|
|
+ switch (request->fl_type & (F_RDLCK|F_WRLCK|F_UNLCK)) {
|
|
+ case F_RDLCK:
|
|
+ if (!(filp->f_mode & FMODE_READ))
|
|
+ return -EBADF;
|
|
+ break;
|
|
+ case F_WRLCK:
|
|
+ if (!(filp->f_mode & FMODE_WRITE))
|
|
+ return -EBADF;
|
|
+ }
|
|
+
|
|
do {
|
|
status = nfs4_proc_setlk(state, cmd, request);
|
|
if ((status != -EAGAIN) || IS_SETLK(cmd))
|
|
--
|
|
1.7.10
|
|
|