diff options
author | gVisor bot <gvisor-bot@google.com> | 2021-08-12 02:13:19 +0000 |
---|---|---|
committer | gVisor bot <gvisor-bot@google.com> | 2021-08-12 02:13:19 +0000 |
commit | 969b2bfa7e3197bf3da133e7c025d88bbc0c2ac2 (patch) | |
tree | 22383a65e2df641b405b88842f0783ad7cba2249 /pkg | |
parent | 4d4c5eeedea7c26e1908bcee314c7294b04aa4c8 (diff) | |
parent | 5456fa6477eee26c553aa84311b3044f1af0d9a1 (diff) |
Merge release-20210726.0-52-g5456fa647 (automated)
Diffstat (limited to 'pkg')
-rw-r--r-- | pkg/sentry/fsimpl/verity/verity.go | 18 |
1 files changed, 15 insertions, 3 deletions
diff --git a/pkg/sentry/fsimpl/verity/verity.go b/pkg/sentry/fsimpl/verity/verity.go index c5fa9855b..d05fa8390 100644 --- a/pkg/sentry/fsimpl/verity/verity.go +++ b/pkg/sentry/fsimpl/verity/verity.go @@ -1091,6 +1091,21 @@ func (fd *fileDescription) enableVerity(ctx context.Context) (uintptr, error) { return 0, fd.d.fs.alertIntegrityViolation("Unexpected verity fd: missing expected underlying fds") } + // Populate children names here. We cannot rely on the children + // dentries to populate parent dentry's children names, because the + // parent dentry may be destroyed before users enable verity if its ref + // count drops to zero. + if fd.d.isDir() { + if err := fd.IterDirents(ctx, vfs.IterDirentsCallbackFunc(func(dirent vfs.Dirent) error { + if dirent.Name != "." && dirent.Name != ".." { + fd.d.childrenNames[dirent.Name] = struct{}{} + } + return nil + })); err != nil { + return 0, err + } + } + hash, dataSize, err := fd.generateMerkleLocked(ctx) if err != nil { return 0, err @@ -1118,9 +1133,6 @@ func (fd *fileDescription) enableVerity(ctx context.Context) (uintptr, error) { }); err != nil { return 0, err } - - // Add the current child's name to parent's childrenNames. - fd.d.parent.childrenNames[fd.d.name] = struct{}{} } // Record the size of the data being hashed for fd. |