• Al Viro's avatar
    step_into() callers: dismiss the symlink earlier · 56676ec3
    Al Viro authored
    We need to dismiss a symlink when we are done traversing it;
    currently that's done when we call step_into() for its last
    component.  For the cases when we do not call step_into()
    for that component (i.e. when it's . or ..) we do the same
    symlink dismissal after the call of handle_dots().
    
    What we need to guarantee is that the symlink won't be dismissed
    while we are still using nd->last.name - it's pointing into the
    body of said symlink.  step_into() is sufficiently late - by
    the time it's called we'd already obtained the dentry, so the
    name we'd been looking up is no longer needed.  However, it
    turns out to be cleaner to have that ("we are done with that
    component now, can dismiss the link") done explicitly - in the
    callers of step_into().
    
    In handle_dots() case we won't be using the component string
    at all, so for . and .. the corresponding point is actually
    _before_ the call of handle_dots(), not after it.
    
    Fix a minor irregularity in do_last(), while we are at it -
    if trailing symlink ended with . or .. we forgot to dismiss
    it.  Not a problem, since nameidata is about to be done with
    (neither . nor .. can be a trailing symlink, so this is the
    last iteration through the loop) and terminate_walk() will
    clean the stack anyway, but let's keep it more regular.
    Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
    56676ec3
namei.c 124 KB