]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
NFSv4: Handle the special Linux file open access mode
authorTrond Myklebust <trond.myklebust@hammerspace.com>
Thu, 27 Jun 2019 10:41:45 +0000 (06:41 -0400)
committerTrond Myklebust <trond.myklebust@hammerspace.com>
Sat, 6 Jul 2019 18:54:25 +0000 (14:54 -0400)
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>
fs/nfs/inode.c
fs/nfs/nfs4file.c

index 0b4a1a974411fd8e5bd0a7834149a2b791e94657..53777813ca95fbf0facd0b7be9d5e9eb542d9500 100644 (file)
@@ -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
index cf42a8b939e3ed0c4e866af3905b1d4ee8ff1dff..3a507c42c1caebe248857432c42c84fbebf0ec13 100644 (file)
@@ -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);