Commit 5347e619 authored by Trond Myklebust's avatar Trond Myklebust Committed by Greg Kroah-Hartman

NFSv4: Handle the special Linux file open access mode

commit 44942b4e 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: ce4ef7c0 ("NFS: Split out NFS v4 file operations")
Cc: stable@vger.kernel.org # 3.6+
Signed-off-by: default avatarTrond Myklebust <trond.myklebust@hammerspace.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 6825ff01
...@@ -1100,6 +1100,7 @@ int nfs_open(struct inode *inode, struct file *filp) ...@@ -1100,6 +1100,7 @@ int nfs_open(struct inode *inode, struct file *filp)
nfs_fscache_open_file(inode, filp); nfs_fscache_open_file(inode, filp);
return 0; return 0;
} }
EXPORT_SYMBOL_GPL(nfs_open);
/* /*
* This function is called whenever some part of NFS notices that * This function is called whenever some part of NFS notices that
......
...@@ -49,7 +49,7 @@ nfs4_file_open(struct inode *inode, struct file *filp) ...@@ -49,7 +49,7 @@ nfs4_file_open(struct inode *inode, struct file *filp)
return err; return err;
if ((openflags & O_ACCMODE) == 3) if ((openflags & O_ACCMODE) == 3)
openflags--; return nfs_open(inode, filp);
/* We can't create new files here */ /* We can't create new files here */
openflags &= ~(O_CREAT|O_EXCL); openflags &= ~(O_CREAT|O_EXCL);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment