|
@@ -979,6 +979,16 @@ static struct task_struct *copy_process(unsigned long clone_flags,
|
|
if ((clone_flags & CLONE_SIGHAND) && !(clone_flags & CLONE_VM))
|
|
if ((clone_flags & CLONE_SIGHAND) && !(clone_flags & CLONE_VM))
|
|
return ERR_PTR(-EINVAL);
|
|
return ERR_PTR(-EINVAL);
|
|
|
|
|
|
|
|
+ /*
|
|
|
|
+ * Siblings of global init remain as zombies on exit since they are
|
|
|
|
+ * not reaped by their parent (swapper). To solve this and to avoid
|
|
|
|
+ * multi-rooted process trees, prevent global and container-inits
|
|
|
|
+ * from creating siblings.
|
|
|
|
+ */
|
|
|
|
+ if ((clone_flags & CLONE_PARENT) &&
|
|
|
|
+ current->signal->flags & SIGNAL_UNKILLABLE)
|
|
|
|
+ return ERR_PTR(-EINVAL);
|
|
|
|
+
|
|
retval = security_task_create(clone_flags);
|
|
retval = security_task_create(clone_flags);
|
|
if (retval)
|
|
if (retval)
|
|
goto fork_out;
|
|
goto fork_out;
|