diff options
author | Al Viro <viro@zeniv.linux.org.uk> | 2016-06-08 03:53:51 +0200 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2016-06-08 03:53:51 +0200 |
commit | a01e718f7241c53f564402f7acff373eed5bd166 (patch) | |
tree | cea10fecfae5e081e954861905c25a7f22143444 /fs | |
parent | fix d_walk()/non-delayed __d_free() race (diff) | |
download | linux-a01e718f7241c53f564402f7acff373eed5bd166.tar.xz linux-a01e718f7241c53f564402f7acff373eed5bd166.zip |
fix a regression in atomic_open()
open("/foo/no_such_file", O_RDONLY | O_CREAT) on should fail with
EACCES when /foo is not writable; failing with ENOENT is obviously
wrong. That got broken by a braino introduced when moving the
creat_error logics from atomic_open() to lookup_open(). Easy to
fix, fortunately.
Spotted-by: "Yan, Zheng" <ukernel@gmail.com>
Tested-by: "Yan, Zheng" <ukernel@gmail.com>
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'fs')
-rw-r--r-- | fs/namei.c | 10 |
1 files changed, 7 insertions, 3 deletions
diff --git a/fs/namei.c b/fs/namei.c index d7c0cac56d89..28cb1cd8507c 100644 --- a/fs/namei.c +++ b/fs/namei.c @@ -2995,9 +2995,13 @@ static int atomic_open(struct nameidata *nd, struct dentry *dentry, } if (*opened & FILE_CREATED) fsnotify_create(dir, dentry); - path->dentry = dentry; - path->mnt = nd->path.mnt; - return 1; + if (unlikely(d_is_negative(dentry))) { + error = -ENOENT; + } else { + path->dentry = dentry; + path->mnt = nd->path.mnt; + return 1; + } } } dput(dentry); |