diff options
Diffstat (limited to 'fs/exec.c')
-rw-r--r-- | fs/exec.c | 29 |
1 files changed, 1 insertions, 28 deletions
@@ -665,9 +665,7 @@ static int de_thread(struct task_struct *tsk) | |||
665 | * and to assume its PID: | 665 | * and to assume its PID: |
666 | */ | 666 | */ |
667 | if (!thread_group_leader(current)) { | 667 | if (!thread_group_leader(current)) { |
668 | struct task_struct *parent; | ||
669 | struct dentry *proc_dentry1, *proc_dentry2; | 668 | struct dentry *proc_dentry1, *proc_dentry2; |
670 | unsigned long ptrace; | ||
671 | 669 | ||
672 | /* | 670 | /* |
673 | * Wait for the thread group leader to be a zombie. | 671 | * Wait for the thread group leader to be a zombie. |
@@ -704,22 +702,6 @@ static int de_thread(struct task_struct *tsk) | |||
704 | * two threads with a switched PID, and release | 702 | * two threads with a switched PID, and release |
705 | * the former thread group leader: | 703 | * the former thread group leader: |
706 | */ | 704 | */ |
707 | ptrace = leader->ptrace; | ||
708 | parent = leader->parent; | ||
709 | if (unlikely(ptrace) && unlikely(parent == current)) { | ||
710 | /* | ||
711 | * Joker was ptracing his own group leader, | ||
712 | * and now he wants to be his own parent! | ||
713 | * We can't have that. | ||
714 | */ | ||
715 | ptrace = 0; | ||
716 | } | ||
717 | |||
718 | ptrace_unlink(current); | ||
719 | ptrace_unlink(leader); | ||
720 | remove_parent(current); | ||
721 | remove_parent(leader); | ||
722 | |||
723 | 705 | ||
724 | /* Become a process group leader with the old leader's pid. | 706 | /* Become a process group leader with the old leader's pid. |
725 | * Note: The old leader also uses thispid until release_task | 707 | * Note: The old leader also uses thispid until release_task |
@@ -730,10 +712,8 @@ static int de_thread(struct task_struct *tsk) | |||
730 | attach_pid(current, PIDTYPE_PID, current->pid); | 712 | attach_pid(current, PIDTYPE_PID, current->pid); |
731 | attach_pid(current, PIDTYPE_PGID, current->signal->pgrp); | 713 | attach_pid(current, PIDTYPE_PGID, current->signal->pgrp); |
732 | attach_pid(current, PIDTYPE_SID, current->signal->session); | 714 | attach_pid(current, PIDTYPE_SID, current->signal->session); |
733 | list_add_tail(¤t->tasks, &init_task.tasks); | 715 | list_add_tail_rcu(¤t->tasks, &init_task.tasks); |
734 | 716 | ||
735 | current->parent = current->real_parent = leader->real_parent; | ||
736 | leader->parent = leader->real_parent = child_reaper; | ||
737 | current->group_leader = current; | 717 | current->group_leader = current; |
738 | leader->group_leader = current; | 718 | leader->group_leader = current; |
739 | 719 | ||
@@ -742,13 +722,6 @@ static int de_thread(struct task_struct *tsk) | |||
742 | detach_pid(leader, PIDTYPE_SID); | 722 | detach_pid(leader, PIDTYPE_SID); |
743 | list_del_init(&leader->tasks); | 723 | list_del_init(&leader->tasks); |
744 | 724 | ||
745 | add_parent(current); | ||
746 | add_parent(leader); | ||
747 | if (ptrace) { | ||
748 | current->ptrace = ptrace; | ||
749 | __ptrace_link(current, parent); | ||
750 | } | ||
751 | |||
752 | current->exit_signal = SIGCHLD; | 725 | current->exit_signal = SIGCHLD; |
753 | 726 | ||
754 | BUG_ON(leader->exit_state != EXIT_ZOMBIE); | 727 | BUG_ON(leader->exit_state != EXIT_ZOMBIE); |