diff options
Diffstat (limited to 'kernel/fork.c')
| -rw-r--r-- | kernel/fork.c | 16 |
1 files changed, 7 insertions, 9 deletions
diff --git a/kernel/fork.c b/kernel/fork.c index dec0136c59f1..b95e5aa0e0de 100644 --- a/kernel/fork.c +++ b/kernel/fork.c @@ -633,6 +633,7 @@ static inline int copy_sighand(unsigned long clone_flags, struct task_struct * t atomic_set(&sig->count, 1); sig->group_exit = 0; sig->group_exit_code = 0; + sig->group_exit_task = NULL; memcpy(sig->action, current->sig->action, sizeof(sig->action)); sig->curr_target = NULL; init_sigpending(&sig->shared_pending); @@ -672,16 +673,13 @@ static struct task_struct *copy_process(unsigned long clone_flags, return ERR_PTR(-EINVAL); /* - * Thread groups must share signals as well: + * Thread groups must share signals as well, and detached threads + * can only be started up within the thread group. */ - if (clone_flags & CLONE_THREAD) - clone_flags |= CLONE_SIGHAND; - /* - * Detached threads can only be started up within the thread - * group. - */ - if (clone_flags & CLONE_DETACHED) - clone_flags |= CLONE_THREAD; + if ((clone_flags & CLONE_THREAD) && !(clone_flags & CLONE_SIGHAND)) + return ERR_PTR(-EINVAL); + if ((clone_flags & CLONE_DETACHED) && !(clone_flags & CLONE_THREAD)) + return ERR_PTR(-EINVAL); retval = security_ops->task_create(clone_flags); if (retval) |
