diff options
-rw-r--r-- | fs/exec.c | 7 | ||||
-rw-r--r-- | include/linux/sched.h | 3 |
2 files changed, 8 insertions, 2 deletions
@@ -723,7 +723,12 @@ static int de_thread(struct task_struct *tsk) | |||
723 | current->parent = current->real_parent = leader->real_parent; | 723 | current->parent = current->real_parent = leader->real_parent; |
724 | leader->parent = leader->real_parent = child_reaper; | 724 | leader->parent = leader->real_parent = child_reaper; |
725 | current->group_leader = current; | 725 | current->group_leader = current; |
726 | leader->group_leader = leader; | 726 | leader->group_leader = current; |
727 | |||
728 | /* Reduce leader to a thread */ | ||
729 | detach_pid(leader, PIDTYPE_PGID); | ||
730 | detach_pid(leader, PIDTYPE_SID); | ||
731 | list_del_init(&leader->tasks); | ||
727 | 732 | ||
728 | add_parent(current); | 733 | add_parent(current); |
729 | add_parent(leader); | 734 | add_parent(leader); |
diff --git a/include/linux/sched.h b/include/linux/sched.h index 541f4828f5e7..a3e4f6b503a3 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h | |||
@@ -1203,7 +1203,8 @@ extern void wait_task_inactive(task_t * p); | |||
1203 | #define while_each_thread(g, t) \ | 1203 | #define while_each_thread(g, t) \ |
1204 | while ((t = next_thread(t)) != g) | 1204 | while ((t = next_thread(t)) != g) |
1205 | 1205 | ||
1206 | #define thread_group_leader(p) (p->pid == p->tgid) | 1206 | /* de_thread depends on thread_group_leader not being a pid based check */ |
1207 | #define thread_group_leader(p) (p == p->group_leader) | ||
1207 | 1208 | ||
1208 | static inline task_t *next_thread(task_t *p) | 1209 | static inline task_t *next_thread(task_t *p) |
1209 | { | 1210 | { |