diff options
author | gVisor bot <gvisor-bot@google.com> | 2021-02-11 01:49:51 +0000 |
---|---|---|
committer | gVisor bot <gvisor-bot@google.com> | 2021-02-11 01:49:51 +0000 |
commit | 03d099577c93e3e4098c85a570e41664a0d72bc0 (patch) | |
tree | ff0bb5597b26cd68a7f7b433b3e9bccba0051121 /pkg/sentry/fsimpl/tmpfs/regular_file.go | |
parent | 9994360861f68e806d4c1e2ad949015cc55d130f (diff) | |
parent | 81ea0016e62318053f97ec714967047e6191fb2b (diff) |
Merge release-20210201.0-84-g81ea0016e (automated)
Diffstat (limited to 'pkg/sentry/fsimpl/tmpfs/regular_file.go')
-rw-r--r-- | pkg/sentry/fsimpl/tmpfs/regular_file.go | 13 |
1 files changed, 10 insertions, 3 deletions
diff --git a/pkg/sentry/fsimpl/tmpfs/regular_file.go b/pkg/sentry/fsimpl/tmpfs/regular_file.go index 82a743ff3..a6d161882 100644 --- a/pkg/sentry/fsimpl/tmpfs/regular_file.go +++ b/pkg/sentry/fsimpl/tmpfs/regular_file.go @@ -91,13 +91,13 @@ type regularFile struct { size uint64 } -func (fs *filesystem) newRegularFile(kuid auth.KUID, kgid auth.KGID, mode linux.FileMode) *inode { +func (fs *filesystem) newRegularFile(kuid auth.KUID, kgid auth.KGID, mode linux.FileMode, parentDir *directory) *inode { file := ®ularFile{ memFile: fs.mfp.MemoryFile(), memoryUsageKind: usage.Tmpfs, seals: linux.F_SEAL_SEAL, } - file.inode.init(file, fs, kuid, kgid, linux.S_IFREG|mode) + file.inode.init(file, fs, kuid, kgid, linux.S_IFREG|mode, parentDir) file.inode.nlink = 1 // from parent directory return &file.inode } @@ -116,7 +116,7 @@ func newUnlinkedRegularFileDescription(ctx context.Context, creds *auth.Credenti panic("tmpfs.newUnlinkedRegularFileDescription() called with non-tmpfs mount") } - inode := fs.newRegularFile(creds.EffectiveKUID, creds.EffectiveKGID, 0777) + inode := fs.newRegularFile(creds.EffectiveKUID, creds.EffectiveKGID, 0777, nil /* parentDir */) d := fs.newDentry(inode) defer d.DecRef(ctx) d.name = name @@ -443,6 +443,13 @@ func (fd *regularFileFD) pwrite(ctx context.Context, src usermem.IOSequence, off rw := getRegularFileReadWriter(f, offset) n, err := src.CopyInTo(ctx, rw) f.inode.touchCMtimeLocked() + for { + old := atomic.LoadUint32(&f.inode.mode) + new := vfs.ClearSUIDAndSGID(old) + if swapped := atomic.CompareAndSwapUint32(&f.inode.mode, old, new); swapped { + break + } + } putRegularFileReadWriter(rw) return n, n + offset, err } |