summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTrond Myklebust2019-06-27 12:41:45 +0200
committerGreg Kroah-Hartman2019-07-26 09:14:22 +0200
commit5347e61954fcf2e47cbe9620aa21e42f4bc94057 (patch)
tree690d368076fdd4d74bc839ed7a7860ef1ce90c94
parentiwlwifi: fix RF-Kill interrupt while FW load for gen2 devices (diff)
downloadkernel-qcow2-linux-5347e61954fcf2e47cbe9620aa21e42f4bc94057.tar.gz
kernel-qcow2-linux-5347e61954fcf2e47cbe9620aa21e42f4bc94057.tar.xz
kernel-qcow2-linux-5347e61954fcf2e47cbe9620aa21e42f4bc94057.zip
NFSv4: Handle the special Linux file open access mode
commit 44942b4e457beda00981f616402a1a791e8c616e upstream. According to the open() manpage, Linux reserves the access mode 3 to mean "check for read and write permission on the file and return a file descriptor that can't be used for reading or writing." Currently, the NFSv4 code will ask the server to open the file, and will use an incorrect share access mode of 0. Since it has an incorrect share access mode, the client later forgets to send a corresponding close, meaning it can leak stateids on the server. Fixes: ce4ef7c0a8a05 ("NFS: Split out NFS v4 file operations") Cc: stable@vger.kernel.org # 3.6+ Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-rw-r--r--fs/nfs/inode.c1
-rw-r--r--fs/nfs/nfs4file.c2
2 files changed, 2 insertions, 1 deletions
diff --git a/fs/nfs/inode.c b/fs/nfs/inode.c
index b65aee481d13..e4cd3a2fe698 100644
--- a/fs/nfs/inode.c
+++ b/fs/nfs/inode.c
@@ -1100,6 +1100,7 @@ int nfs_open(struct inode *inode, struct file *filp)
nfs_fscache_open_file(inode, filp);
return 0;
}
+EXPORT_SYMBOL_GPL(nfs_open);
/*
* This function is called whenever some part of NFS notices that
diff --git a/fs/nfs/nfs4file.c b/fs/nfs/nfs4file.c
index 134858507268..61abbb087ed1 100644
--- a/fs/nfs/nfs4file.c
+++ b/fs/nfs/nfs4file.c
@@ -49,7 +49,7 @@ nfs4_file_open(struct inode *inode, struct file *filp)
return err;
if ((openflags & O_ACCMODE) == 3)
- openflags--;
+ return nfs_open(inode, filp);
/* We can't create new files here */
openflags &= ~(O_CREAT|O_EXCL);