• Al Viro's avatar
    sanitize handling of nd->last_type, kill LAST_BIND · b4c03536
    Al Viro authored
    ->last_type values are set in 3 places: path_init() (sets to LAST_ROOT),
    link_path_walk (LAST_NORM/DOT/DOTDOT) and pick_link (LAST_BIND).
    
    The are checked in walk_component(), lookup_last() and do_last().
    They also get copied to the caller by filename_parentat().  In the last
    3 cases the value is what we had at the return from link_path_walk().
    In case of walk_component() it's either directly downstream from
    assignment in link_path_walk() or, when called by lookup_last(), the
    value we have at the return from link_path_walk().
    
    The value at the entry into link_path_walk() can survive to return only
    if the pathname contains nothing but slashes.  Note that pick_link()
    never returns such - pure jumps are handled directly.  So for the calls
    of link_path_walk() for trailing symlinks it does not matter what value
    had been there at the entry; the value at the return won't depend upon it.
    
    There are 3 call chains that might have pick_link() storing LAST_BIND:
    
    1) pick_link() from step_into() from walk_component() from
    link_path_walk().  In that case we will either be parsing the next
    component immediately after return into link_path_walk(), which will
    overwrite the ->last_type before anyone has a chance to look at it,
    or we'll fail, in which case nobody will be looking at ->last_type at all.
    
    2) pick_link() from step_into() from walk_component() from lookup_last().
    The value is never looked at due to the above; it won't affect the value
    seen at return from any link_path_walk().
    
    3) pick_link() from step_into() from do_last().  Ditto.
    
    In other words, assignemnt in pick_link() is pointless, and so is
    LAST_BIND itself; nothing ever looks at that value.  Kill it off.
    And make link_path_walk() _always_ assign ->last_type - in the only
    case when the value at the entry might survive to the return that value
    is always LAST_ROOT, inherited from path_init().  Move that assignment
    from path_init() into the beginning of link_path_walk(), to consolidate
    the things.
    
    Historical note: LAST_BIND used to be used for the kludge with trailing
    pure jump symlinks (extra iteration through the top-level loop).
    No point keeping it anymore...
    Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
    b4c03536
path-lookup.rst 71 KB