• Eddie.Horng's avatar
    cap_inode_getsecurity: use d_find_any_alias() instead of d_find_alias() · 5a842ecc
    Eddie.Horng authored
    commit 355139a8 upstream.
    
    The code in cap_inode_getsecurity(), introduced by commit 8db6c34f
    ("Introduce v3 namespaced file capabilities"), should use
    d_find_any_alias() instead of d_find_alias() do handle unhashed dentry
    correctly. This is needed, for example, if execveat() is called with an
    open but unlinked overlayfs file, because overlayfs unhashes dentry on
    unlink.
    This is a regression of real life application, first reported at
    https://www.spinics.net/lists/linux-unionfs/msg05363.html
    
    Below reproducer and setup can reproduce the case.
      const char* exec="echo";
      const char *newargv[] = { "echo", "hello", NULL};
      const char *newenviron[] = { NULL };
      int fd, err;
    
      fd = open(exec, O_PATH);
      unlink(exec);
      err = syscall(322/*SYS_execveat*/, fd, "", newargv, newenviron,
    AT_EMPTY_PATH);
      if(err<0)
        fprintf(stderr, "execveat: %s\n", strerror(errno));
    
    gcc compile into ~/test/a.out
    mount...
    5a842ecc
commoncap.c 36.8 KB