diff options
Diffstat (limited to 'fs/exec.c')
-rw-r--r-- | fs/exec.c | 14 |
1 files changed, 11 insertions, 3 deletions
@@ -708,7 +708,17 @@ static int de_thread(struct task_struct *tsk) | |||
708 | remove_parent(current); | 708 | remove_parent(current); |
709 | remove_parent(leader); | 709 | remove_parent(leader); |
710 | 710 | ||
711 | switch_exec_pids(leader, current); | 711 | |
712 | /* Become a process group leader with the old leader's pid. | ||
713 | * Note: The old leader also uses thispid until release_task | ||
714 | * is called. Odd but simple and correct. | ||
715 | */ | ||
716 | detach_pid(current, PIDTYPE_PID); | ||
717 | current->pid = leader->pid; | ||
718 | attach_pid(current, PIDTYPE_PID, current->pid); | ||
719 | attach_pid(current, PIDTYPE_PGID, current->signal->pgrp); | ||
720 | attach_pid(current, PIDTYPE_SID, current->signal->session); | ||
721 | list_add_tail(¤t->tasks, &init_task.tasks); | ||
712 | 722 | ||
713 | current->parent = current->real_parent = leader->real_parent; | 723 | current->parent = current->real_parent = leader->real_parent; |
714 | leader->parent = leader->real_parent = child_reaper; | 724 | leader->parent = leader->real_parent = child_reaper; |
@@ -722,8 +732,6 @@ static int de_thread(struct task_struct *tsk) | |||
722 | __ptrace_link(current, parent); | 732 | __ptrace_link(current, parent); |
723 | } | 733 | } |
724 | 734 | ||
725 | list_del(¤t->tasks); | ||
726 | list_add_tail(¤t->tasks, &init_task.tasks); | ||
727 | current->exit_signal = SIGCHLD; | 735 | current->exit_signal = SIGCHLD; |
728 | 736 | ||
729 | BUG_ON(leader->exit_state != EXIT_ZOMBIE); | 737 | BUG_ON(leader->exit_state != EXIT_ZOMBIE); |