diff --git a/pkg/sentry/kernel/task_clone.go b/pkg/sentry/kernel/task_clone.go index 3e494178d..b9ede9006 100644 --- a/pkg/sentry/kernel/task_clone.go +++ b/pkg/sentry/kernel/task_clone.go @@ -147,7 +147,7 @@ func (t *Task) Clone(args *linux.CloneArgs) (ThreadID, *SyscallControl, error) { return 0, nil, err } cu.Add(func() { - image.release() + image.release(t) }) // clone() returns 0 in the child. image.Arch.SetReturn(0) diff --git a/pkg/sentry/kernel/task_exec.go b/pkg/sentry/kernel/task_exec.go index 6960c6e6d..460058331 100644 --- a/pkg/sentry/kernel/task_exec.go +++ b/pkg/sentry/kernel/task_exec.go @@ -94,7 +94,7 @@ func (*execStop) Killable() bool { return true } // goroutine. func (t *Task) Execve(newImage *TaskImage, argv, env []string, executable *vfs.FileDescription, pathname string) (*SyscallControl, error) { cu := cleanup.Make(func() { - newImage.release() + newImage.release(t) }) defer cu.Clean() // We can't clearly hold kernel package locks while stat'ing executable. @@ -154,7 +154,7 @@ func (r *runSyscallAfterExecStop) execute(t *Task) taskRunState { t.tg.execing = nil if t.killed() { t.tg.pidns.owner.mu.Unlock() - r.image.release() + r.image.release(t) return (*runInterrupt)(nil) } // We are the thread group leader now. Save our old thread ID for @@ -248,7 +248,7 @@ func (r *runSyscallAfterExecStop) execute(t *Task) taskRunState { // Don't hold t.mu while calling t.image.release(), that may // attempt to acquire TaskImage.MemoryManager.mappingMu, a lock order // violation. - oldImage.release() + oldImage.release(t) t.unstopVforkParent() t.p.FullStateChanged() diff --git a/pkg/sentry/kernel/task_image.go b/pkg/sentry/kernel/task_image.go index 1e75e9f05..d3c5aee88 100644 --- a/pkg/sentry/kernel/task_image.go +++ b/pkg/sentry/kernel/task_image.go @@ -54,11 +54,11 @@ type TaskImage struct { // release releases all resources held by the TaskImage. release is called by // the task when it execs into a new TaskImage. -func (image *TaskImage) release() { +func (image *TaskImage) release(ctx context.Context) { // Nil out pointers so that if the task is saved after release, it doesn't // follow the pointers to possibly now-invalid objects. if image.MemoryManager != nil { - image.MemoryManager.DecUsers(context.Background()) + image.MemoryManager.DecUsers(ctx) image.MemoryManager = nil } image.fu = nil diff --git a/pkg/sentry/kernel/task_start.go b/pkg/sentry/kernel/task_start.go index ae8f70ad9..5745afc31 100644 --- a/pkg/sentry/kernel/task_start.go +++ b/pkg/sentry/kernel/task_start.go @@ -113,7 +113,7 @@ type TaskConfig struct { func (ts *TaskSet) NewTask(ctx context.Context, cfg *TaskConfig) (*Task, error) { var err error cleanup := func() { - cfg.TaskImage.release() + cfg.TaskImage.release(ctx) cfg.FSContext.DecRef(ctx) cfg.FDTable.DecRef(ctx) cfg.IPCNamespace.DecRef(ctx)