From 69e0c7643d821f03ed797ea3911f6ab458e2a2d6 Mon Sep 17 00:00:00 2001 From: Etienne Perot Date: Wed, 29 Nov 2023 17:56:45 -0800 Subject: [PATCH] Use `clear` on `map` types wherever possible. This is similar as pull request #9749 but for maps rather than slices. PiperOrigin-RevId: 586504320 --- pkg/bpf/program_builder.go | 2 +- pkg/p9/client.go | 2 +- pkg/sentry/fsimpl/cgroupfs/devices.go | 4 ++-- pkg/sentry/fsimpl/lock/lock.go | 4 ++-- pkg/sentry/fsimpl/lock/lock_test.go | 3 +++ pkg/sentry/kernel/ptrace.go | 3 +-- pkg/sentry/kernel/task_exec.go | 2 +- pkg/sentry/kernel/thread_group.go | 2 +- pkg/sentry/vfs/vfs.go | 3 ++- pkg/tcpip/stack/neighbor_cache.go | 2 +- tools/checklocks/state.go | 2 +- 11 files changed, 16 insertions(+), 13 deletions(-) diff --git a/pkg/bpf/program_builder.go b/pkg/bpf/program_builder.go index faaf3e46b..eb0e07b22 100644 --- a/pkg/bpf/program_builder.go +++ b/pkg/bpf/program_builder.go @@ -213,7 +213,7 @@ func (b *ProgramBuilder) resolveLabels() error { b.instructions[s.line] = inst } } - b.labels = map[string]*label{} + clear(b.labels) return nil } diff --git a/pkg/p9/client.go b/pkg/p9/client.go index 50246bd10..bfc62d817 100644 --- a/pkg/p9/client.go +++ b/pkg/p9/client.go @@ -390,7 +390,7 @@ func (c *Client) handleOne() { for _, resp := range c.pending { resp.done <- err } - c.pending = make(map[Tag]*response) + clear(c.pending) c.pendingMu.Unlock() } else { // Process the tag. diff --git a/pkg/sentry/fsimpl/cgroupfs/devices.go b/pkg/sentry/fsimpl/cgroupfs/devices.go index efdbe2f02..6d2d863cc 100644 --- a/pkg/sentry/fsimpl/cgroupfs/devices.go +++ b/pkg/sentry/fsimpl/cgroupfs/devices.go @@ -221,7 +221,7 @@ func (c *devicesController) applyRule(id deviceID, p permission, allow bool) err // If the device type is all, it will reset the rules for all. if id.controllerType == wildcardDevice { c.defaultAllow = allow - c.deviceRules = make(map[deviceID]permission) + clear(c.deviceRules) return nil } if !p.valid() { @@ -229,7 +229,7 @@ func (c *devicesController) applyRule(id deviceID, p permission, allow bool) err } if len(c.deviceRules) == 0 { c.defaultAllow = allow - c.deviceRules = make(map[deviceID]permission) + clear(c.deviceRules) } if allow == c.defaultAllow { return c.addRule(id, p) diff --git a/pkg/sentry/fsimpl/lock/lock.go b/pkg/sentry/fsimpl/lock/lock.go index 372e5f8c8..730945574 100644 --- a/pkg/sentry/fsimpl/lock/lock.go +++ b/pkg/sentry/fsimpl/lock/lock.go @@ -235,7 +235,7 @@ func (l *Lock) lock(uid UniqueID, ownerPID int32, t LockType, ofd bool) { panic(fmt.Sprintf("lock: cannot downgrade write lock to read lock for uid %d, writer is %d", uid, l.Writer)) } // Ensure that there is only one reader if upgrading. - l.Readers = make(map[UniqueID]OwnerInfo) + clear(l.Readers) // Ensure that there is no longer a writer. l.Writer = nil } @@ -258,7 +258,7 @@ func (l *Lock) lock(uid UniqueID, ownerPID int32, t LockType, ofd bool) { } } // Ensure that there is only a writer. - l.Readers = make(map[UniqueID]OwnerInfo) + clear(l.Readers) l.Writer = uid l.WriterInfo = OwnerInfo{PID: ownerPID, OFD: ofd} default: diff --git a/pkg/sentry/fsimpl/lock/lock_test.go b/pkg/sentry/fsimpl/lock/lock_test.go index dd2bc71a8..f82dc7b78 100644 --- a/pkg/sentry/fsimpl/lock/lock_test.go +++ b/pkg/sentry/fsimpl/lock/lock_test.go @@ -56,6 +56,9 @@ func equals(e0, e1 []entry) bool { func fill(entries []entry) LockSet { l := LockSet{} for _, e := range entries { + if e.Readers == nil { + e.Readers = make(map[UniqueID]OwnerInfo) + } gap := l.FindGap(e.LockRange.Start) if !gap.Ok() { panic("cannot insert into existing segment") diff --git a/pkg/sentry/kernel/ptrace.go b/pkg/sentry/kernel/ptrace.go index 7e009daf6..17ac1b56a 100644 --- a/pkg/sentry/kernel/ptrace.go +++ b/pkg/sentry/kernel/ptrace.go @@ -584,8 +584,7 @@ func (t *Task) exitPtrace() { // this is consistent with Linux. target.forgetTracerLocked() } - // "nil maps cannot be saved" - t.ptraceTracees = make(map[*Task]struct{}) + clear(t.ptraceTracees) // nil maps cannot be saved if t.ptraceYAMAExceptionAdded { delete(t.k.ptraceExceptions, t) diff --git a/pkg/sentry/kernel/task_exec.go b/pkg/sentry/kernel/task_exec.go index 460058331..1e67e79e6 100644 --- a/pkg/sentry/kernel/task_exec.go +++ b/pkg/sentry/kernel/task_exec.go @@ -174,7 +174,7 @@ func (r *runSyscallAfterExecStop) execute(t *Task) taskRunState { for _, it := range t.tg.timers { its = append(its, it) } - t.tg.timers = make(map[linux.TimerID]*IntervalTimer) + clear(t.tg.timers) t.tg.signalHandlers.mu.Unlock() t.tg.pidns.owner.mu.Unlock() for _, it := range its { diff --git a/pkg/sentry/kernel/thread_group.go b/pkg/sentry/kernel/thread_group.go index 88404aa39..fba6dbb80 100644 --- a/pkg/sentry/kernel/thread_group.go +++ b/pkg/sentry/kernel/thread_group.go @@ -321,7 +321,7 @@ func (tg *ThreadGroup) Release(ctx context.Context) { for _, it := range tg.timers { its = append(its, it) } - tg.timers = make(map[linux.TimerID]*IntervalTimer) // nil maps can't be saved + clear(tg.timers) // nil maps can't be saved // Disassociate from the tty if we have one. if tg.tty != nil { tg.tty.mu.Lock() diff --git a/pkg/sentry/vfs/vfs.go b/pkg/sentry/vfs/vfs.go index 2bbbe954d..6bc726e5f 100644 --- a/pkg/sentry/vfs/vfs.go +++ b/pkg/sentry/vfs/vfs.go @@ -992,7 +992,7 @@ func (vfs *VirtualFilesystem) PopDelayedDecRefs() []refs.RefCounter { rcs = append(rcs, rc) } } - vfs.toDecRef = map[refs.RefCounter]int{} + clear(vfs.toDecRef) return rcs } @@ -1023,6 +1023,7 @@ func (vfs *VirtualFilesystem) unlockMounts(ctx context.Context) { return } toDecRef := vfs.toDecRef + // Can't use `clear` here as this would reference the same map as `toDecRef`. vfs.toDecRef = map[refs.RefCounter]int{} vfs.mountMu.Unlock() for rc, refs := range toDecRef { diff --git a/pkg/tcpip/stack/neighbor_cache.go b/pkg/tcpip/stack/neighbor_cache.go index c08073679..ce7215ca8 100644 --- a/pkg/tcpip/stack/neighbor_cache.go +++ b/pkg/tcpip/stack/neighbor_cache.go @@ -247,7 +247,7 @@ func (n *neighborCache) clear() { } n.mu.dynamic.lru = neighborEntryList{} - n.mu.cache = make(map[tcpip.Address]*neighborEntry) + clear(n.mu.cache) n.mu.dynamic.count = 0 } diff --git a/tools/checklocks/state.go b/tools/checklocks/state.go index 2de373b27..c342342aa 100644 --- a/tools/checklocks/state.go +++ b/tools/checklocks/state.go @@ -101,7 +101,7 @@ func (l *lockState) modify() { l.stored = s // Reset the used values. - l.used = make(map[ssa.Value]struct{}) + clear(l.used) // Copy the defers. ds := make([]*ssa.Defer, len(l.defers))