OSDN Git Service

do_last(): rejoin the common path even earlier in FMODE_{OPENED,CREATED} case
authorAl Viro <viro@zeniv.linux.org.uk>
Sun, 26 Jan 2020 15:48:16 +0000 (10:48 -0500)
committerAl Viro <viro@zeniv.linux.org.uk>
Sat, 14 Mar 2020 01:09:13 +0000 (21:09 -0400)
... getting may_create_in_sticky() checks in FMODE_OPENED case as well.

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
fs/namei.c

index 8cdf8ef..7986725 100644 (file)
@@ -3199,14 +3199,7 @@ static const char *do_last(struct nameidata *nd,
        if (IS_ERR(dentry))
                return ERR_CAST(dentry);
 
-       if (file->f_mode & FMODE_OPENED) {
-               audit_inode(nd->name, file->f_path.dentry, 0);
-               dput(nd->path.dentry);
-               nd->path.dentry = dentry;
-               goto finish_open_created;
-       }
-
-       if (file->f_mode & FMODE_CREATED) {
+       if (file->f_mode & (FMODE_OPENED | FMODE_CREATED)) {
                dput(nd->path.dentry);
                nd->path.dentry = dentry;
                goto finish_open_created;
@@ -3230,7 +3223,9 @@ finish_open:
        error = complete_walk(nd);
        if (error)
                return ERR_PTR(error);
-       audit_inode(nd->name, nd->path.dentry, 0);
+finish_open_created:
+       if (!(file->f_mode & FMODE_CREATED))
+               audit_inode(nd->name, nd->path.dentry, 0);
        if (open_flag & O_CREAT) {
                if (d_is_dir(nd->path.dentry))
                        return ERR_PTR(-EISDIR);
@@ -3242,7 +3237,6 @@ finish_open:
        if ((nd->flags & LOOKUP_DIRECTORY) && !d_can_lookup(nd->path.dentry))
                return ERR_PTR(-ENOTDIR);
 
-finish_open_created:
        do_truncate = false;
        acc_mode = op->acc_mode;
        if (file->f_mode & FMODE_CREATED) {