• Amir Goldstein's avatar
    ovl: fix lookup with middle layer opaque dir and absolute path redirects · 3ec9b3fa
    Amir Goldstein authored
    As of now if we encounter an opaque dir while looking for a dentry, we set
    d->last=true. This means that there is no need to look further in any of
    the lower layers. This works fine as long as there are no redirets or
    relative redircts. But what if there is an absolute redirect on the
    children dentry of opaque directory. We still need to continue to look into
    next lower layer. This patch fixes it.
    
    Here is an example to demonstrate the issue. Say you have following setup.
    
    upper:  /redirect (redirect=/a/b/c)
    lower1: /a/[b]/c       ([b] is opaque) (c has absolute redirect=/a/b/d/)
    lower0: /a/b/d/foo
    
    Now "redirect" dir should merge with lower1:/a/b/c/ and lower0:/a/b/d.
    Note, despite the fact lower1:/a/[b] is opaque, we need to continue to look
    into lower0 because children c has an absolute redirect.
    
    Following is a reproducer.
    
    Watch me make foo disappear:
    
     $ mkdir lower middle upper work work2 merged
     $ mkdir lower/origin
     $ touch lower/origin/foo
     $ mount -t overlay none merged/ \
             -olowerdir=lower,upperdir=middle,workdir=work2
     $ mkdir merged/pure
     $ mv merged/origin merged/pure/redirect
     $ umount merged
     $ mount -t overlay none merged/ \
             -olowerdir=middle:lower,upperdir=upper,workdir=work
     $ mv merged/pure/redirect merged/redirect
    
    Now you see foo inside a twice redirected merged dir:
    
     $ ls merged/redirect
     foo
     $ umount merged
     $ mount -t overlay none merged/ \
             -olowerdir=middle:lower,upperdir=upper,workdir=work
    
    After mount cycle you don't see foo inside the same dir:
    
     $ ls merged/redirect
    
    During middle layer lookup, the opaqueness of middle/pure is left in
    the lookup state and then middle/pure/redirect is wrongly treated as
    opaque.
    
    Fixes: 02b69b28 ("ovl: lookup redirects")
    Cc: <stable@vger.kernel.org> #v4.10
    Signed-off-by: default avatarAmir Goldstein <amir73il@gmail.com>
    Signed-off-by: default avatarVivek Goyal <vgoyal@redhat.com>
    Signed-off-by: default avatarMiklos Szeredi <mszeredi@redhat.com>
    3ec9b3fa
namei.c 25.2 KB