summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--pkg/sentry/kernel/task_clone.go8
-rw-r--r--pkg/sentry/kernel/task_start.go7
2 files changed, 12 insertions, 3 deletions
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{}{}
}