diff options
author | J. R. Okajima <hooanon05@yahoo.co.jp> | 2011-01-14 03:56:04 (GMT) |
---|---|---|
committer | Nick Piggin <npiggin@kernel.dk> | 2011-01-14 03:56:04 (GMT) |
commit | f20877d94a74557b7c28b4ed8920d834c31e0ea5 (patch) | |
tree | 88ea4019a1a8a0a3b8c2f24479ec44b353928f3f | |
parent | 657e94b673a805b427903c5628e95348235fad06 (diff) | |
download | linux-f20877d94a74557b7c28b4ed8920d834c31e0ea5.tar.xz |
fs: fix do_last error case when need_reval_dot
When open(2) without O_DIRECTORY opens an existing dir, it should return
EISDIR. In do_last(), the variable 'error' is initialized EISDIR, but it
is changed by d_revalidate() which returns any positive to represent
'the target dir is valid.'
Should we keep and return the initialized 'error' in this case.
Signed-off-by: Nick Piggin <npiggin@kernel.dk>
-rw-r--r-- | fs/namei.c | 10 |
1 files changed, 6 insertions, 4 deletions
@@ -2122,11 +2122,13 @@ static struct file *do_last(struct nameidata *nd, struct path *path, dir = nd->path.dentry; case LAST_DOT: if (need_reval_dot(dir)) { - error = d_revalidate(nd->path.dentry, nd); - if (!error) - error = -ESTALE; - if (error < 0) + int status = d_revalidate(nd->path.dentry, nd); + if (!status) + status = -ESTALE; + if (status < 0) { + error = status; goto exit; + } } /* fallthrough */ case LAST_ROOT: |