NFSv4: Fix a problem whereby a buggy server can oops the kernel
authorTrond Myklebust <Trond.Myklebust@netapp.com>
Tue, 21 Jul 2009 23:22:38 +0000 (19:22 -0400)
committerTrond Myklebust <Trond.Myklebust@netapp.com>
Tue, 21 Jul 2009 23:22:38 +0000 (19:22 -0400)
commitd953126a28f97ec965d23c69fd5795854c048f30
treed3f239909dac00e1bc7882a783b8b63b20345d4d
parentfccba8045537f7e840d0e7565e1989d465e488a3
NFSv4: Fix a problem whereby a buggy server can oops the kernel

We just had a case in which a buggy server occasionally returns the wrong
attributes during an OPEN call. While the client does catch this sort of
condition in nfs4_open_done(), and causes the nfs4_atomic_open() to return
-EISDIR, the logic in nfs_atomic_lookup() is broken, since it causes a
fallback to an ordinary lookup instead of just returning the error.

When the buggy server then returns a regular file for the fallback lookup,
the VFS allows the open, and bad things start to happen, since the open
file doesn't have any associated NFSv4 state.

The fix is firstly to return the EISDIR/ENOTDIR errors immediately, and
secondly to ensure that we are always careful when dereferencing the
nfs_open_context state pointer.

Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
fs/nfs/dir.c
fs/nfs/nfs4proc.c