Add vfs.PathnameReachable().
/proc/[pid]/mount* omit mounts whose mount point is outside the chroot, which is checked (indirectly) via __d_path(). PiperOrigin-RevId: 303434226
This commit is contained in:
parent
10f2c8db91
commit
f6e4daa67a
|
@ -90,6 +90,49 @@ loop:
|
|||
return b.String(), nil
|
||||
}
|
||||
|
||||
// PathnameReachable returns an absolute pathname to vd, consistent with
|
||||
// Linux's __d_path() (as used by seq_path_root()). If vfsroot.Ok() and vd is
|
||||
// not reachable from vfsroot, such that seq_path_root() would return SEQ_SKIP
|
||||
// (causing the entire containing entry to be skipped), PathnameReachable
|
||||
// returns ("", nil).
|
||||
func (vfs *VirtualFilesystem) PathnameReachable(ctx context.Context, vfsroot, vd VirtualDentry) (string, error) {
|
||||
b := getFSPathBuilder()
|
||||
defer putFSPathBuilder(b)
|
||||
haveRef := false
|
||||
defer func() {
|
||||
if haveRef {
|
||||
vd.DecRef()
|
||||
}
|
||||
}()
|
||||
loop:
|
||||
for {
|
||||
err := vd.mount.fs.impl.PrependPath(ctx, vfsroot, vd, b)
|
||||
switch err.(type) {
|
||||
case nil:
|
||||
if vd.mount == vfsroot.mount && vd.mount.root == vfsroot.dentry {
|
||||
break loop
|
||||
}
|
||||
nextVD := vfs.getMountpointAt(vd.mount, vfsroot)
|
||||
if !nextVD.Ok() {
|
||||
return "", nil
|
||||
}
|
||||
if haveRef {
|
||||
vd.DecRef()
|
||||
}
|
||||
vd = nextVD
|
||||
haveRef = true
|
||||
case PrependPathAtVFSRootError:
|
||||
break loop
|
||||
case PrependPathAtNonMountRootError, PrependPathSyntheticError:
|
||||
return "", nil
|
||||
default:
|
||||
return "", err
|
||||
}
|
||||
}
|
||||
b.PrependByte('/')
|
||||
return b.String(), nil
|
||||
}
|
||||
|
||||
// PathnameForGetcwd returns an absolute pathname to vd, consistent with
|
||||
// Linux's sys_getcwd().
|
||||
func (vfs *VirtualFilesystem) PathnameForGetcwd(ctx context.Context, vfsroot, vd VirtualDentry) (string, error) {
|
||||
|
|
Loading…
Reference in New Issue