lkml.org 
[lkml]   [2015]   [May]   [11]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v3 025/110] do_last: regularize the logics around following symlinks
    Date
    From: Al Viro <viro@zeniv.linux.org.uk>

    With LOOKUP_FOLLOW we unlazy and return 1; without it we either
    fail with ELOOP or, for O_PATH opens, succeed. No need to mix
    those cases...

    Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
    ---
    fs/namei.c | 15 +++++++--------
    1 file changed, 7 insertions(+), 8 deletions(-)

    diff --git a/fs/namei.c b/fs/namei.c
    index 3e45233..54cbfe7 100644
    --- a/fs/namei.c
    +++ b/fs/namei.c
    @@ -3046,9 +3046,7 @@ retry_lookup:
    goto out;
    }
    finish_lookup:
    - /* we _can_ be in RCU mode here */
    - if (should_follow_link(path->dentry,
    - !(open_flag & O_PATH) || (nd->flags & LOOKUP_FOLLOW))) {
    + if (should_follow_link(path->dentry, nd->flags & LOOKUP_FOLLOW)) {
    if (nd->flags & LOOKUP_RCU) {
    if (unlikely(nd->path.mnt != path->mnt ||
    unlazy_walk(nd, path->dentry))) {
    @@ -3057,14 +3055,15 @@ finish_lookup:
    }
    }
    BUG_ON(inode != path->dentry->d_inode);
    - if (!(nd->flags & LOOKUP_FOLLOW)) {
    - path_put_conditional(path, nd);
    - path_put(&nd->path);
    - return -ELOOP;
    - }
    return 1;
    }

    + if (unlikely(d_is_symlink(path->dentry)) && !(open_flag & O_PATH)) {
    + path_to_nameidata(path, nd);
    + error = -ELOOP;
    + goto out;
    + }
    +
    if ((nd->flags & LOOKUP_RCU) || nd->path.mnt != path->mnt) {
    path_to_nameidata(path, nd);
    } else {
    --
    2.1.4


    \
     
     \ /
      Last update: 2015-05-11 20:41    [W:4.848 / U:0.136 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site