From 41aeb680b1882c9416e25e100b5ff5eebead36de Mon Sep 17 00:00:00 2001 From: Jamie Liu Date: Mon, 9 Jul 2018 16:15:14 -0700 Subject: Inherit parent in clone(CLONE_THREAD) under TaskSet.mu. PiperOrigin-RevId: 203849534 Change-Id: I4d81513bfd32e0b7fc40c8a4c194eba7abc35a83 --- pkg/sentry/kernel/task_clone.go | 8 +++++--- pkg/sentry/kernel/task_start.go | 7 +++++++ 2 files changed, 12 insertions(+), 3 deletions(-) (limited to 'pkg') diff --git a/pkg/sentry/kernel/task_clone.go b/pkg/sentry/kernel/task_clone.go index 0c2427952..a61283267 100644 --- a/pkg/sentry/kernel/task_clone.go +++ b/pkg/sentry/kernel/task_clone.go @@ -220,18 +220,15 @@ func (t *Task) Clone(opts *CloneOptions) (ThreadID, *SyscallControl, error) { pidns = pidns.NewChild(userns) } tg := t.tg - parent := t.parent if opts.NewThreadGroup { sh := t.tg.signalHandlers if opts.NewSignalHandlers { sh = sh.Fork() } tg = NewThreadGroup(pidns, sh, opts.TerminationSignal, tg.limits.GetCopy(), t.k.monotonicClock) - parent = t } cfg := &TaskConfig{ Kernel: t.k, - Parent: parent, ThreadGroup: tg, TaskContext: tc, TaskResources: t.tr.Fork(!opts.NewFiles, !opts.NewFSContext), @@ -242,6 +239,11 @@ func (t *Task) Clone(opts *CloneOptions) (ThreadID, *SyscallControl, error) { UTSNamespace: utsns, IPCNamespace: ipcns, } + if opts.NewThreadGroup { + cfg.Parent = t + } else { + cfg.InheritParent = t + } if opts.NewNetworkNamespace { cfg.NetworkNamespaced = true } diff --git a/pkg/sentry/kernel/task_start.go b/pkg/sentry/kernel/task_start.go index 801cb3395..c97dee8fc 100644 --- a/pkg/sentry/kernel/task_start.go +++ b/pkg/sentry/kernel/task_start.go @@ -31,6 +31,10 @@ type TaskConfig struct { // Parent is the new task's parent. Parent may be nil. Parent *Task + // If InheritParent is not nil, use InheritParent's parent as the new + // task's parent. + InheritParent *Task + // ThreadGroup is the ThreadGroup the new task belongs to. *ThreadGroup @@ -133,6 +137,9 @@ func (ts *TaskSet) newTask(cfg *TaskConfig) (*Task, error) { // IDs). t.updateLogPrefixLocked() + if cfg.InheritParent != nil { + t.parent = cfg.InheritParent.parent + } if t.parent != nil { t.parent.children[t] = struct{}{} } -- cgit v1.2.3