mirror of
https://github.com/raspberrypi/linux.git
synced 2025-12-06 01:49:46 +00:00
namei: ->d_inode of a pinned dentry is stable only for positives
[ Upstream commit d4565649b6 ]
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>
This commit is contained in:
@@ -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)) {
|
||||
|
||||
Reference in New Issue
Block a user