aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--fs/exec.c7
-rw-r--r--include/linux/sched.h3
2 files changed, 8 insertions, 2 deletions
diff --git a/fs/exec.c b/fs/exec.c
index 0291a68a3626..4d38ad0b70d6 100644
--- a/fs/exec.c
+++ b/fs/exec.c
@@ -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
1208static inline task_t *next_thread(task_t *p) 1209static inline task_t *next_thread(task_t *p)
1209{ 1210{