]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
namei: ->d_inode of a pinned dentry is stable only for positives
authorAl Viro <viro@zeniv.linux.org.uk>
Sun, 28 Feb 2016 00:23:16 +0000 (19:23 -0500)
committerChuck Anderson <chuck.anderson@oracle.com>
Thu, 26 May 2016 22:45:33 +0000 (15:45 -0700)
Orabug: 23330981

[ Upstream commit d4565649b6d6923369112758212b851adc407f0c ]

both do_last() and walk_component() risk picking a NULL inode out
of dentry about to become positive, *then* checking its flags and
seeing that it's not negative anymore and using (already stale by
then) value they'd fetched earlier.  Usually ends up oopsing soon
after that...

Cc: stable@vger.kernel.org # v3.13+
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Signed-off-by: Sasha Levin <sasha.levin@oracle.com>
(cherry picked from commit 9b77cd137fd841d7a14e1c9428cfc49f4df0306e)

Signed-off-by: Dan Duval <dan.duval@oracle.com>
fs/namei.c

index 438572278a9e34cfef0a95474b0ab3cd168dc41c..f3cc848da8bc424e3b7ca302b2fd341e603a244b 100644 (file)
@@ -1619,10 +1619,10 @@ static inline int walk_component(struct nameidata *nd, struct path *path,
                if (err < 0)
                        goto out_err;
 
-               inode = path->dentry->d_inode;
                err = -ENOENT;
                if (d_is_negative(path->dentry))
                        goto out_path_put;
+               inode = path->dentry->d_inode;
        }
 
        if (should_follow_link(path->dentry, follow)) {
@@ -3078,6 +3078,7 @@ retry_lookup:
                path_to_nameidata(path, nd);
                goto out;
        }
+       inode = path->dentry->d_inode;
 finish_lookup:
        /* we _can_ be in RCU mode here */
        if (should_follow_link(path->dentry, !symlink_ok)) {