]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/commit
Correct the problems with the ptrace(2) making the debuggee an orphan.
authorkib <kib@FreeBSD.org>
Thu, 7 Aug 2014 05:47:53 +0000 (05:47 +0000)
committerkib <kib@FreeBSD.org>
Thu, 7 Aug 2014 05:47:53 +0000 (05:47 +0000)
commit0b059d23c7081e1cea5512459c573223dc017be9
tree033a19954132b23984c24a614f928220b364cc2b
parentffe6b11ba6dedd5eff6feb31b9e53c526bf6c5dd
Correct the problems with the ptrace(2) making the debuggee an orphan.
One problem is inferior(9) looping due to the process tree becoming a
graph instead of tree if the parent is traced by child. Another issue
is due to the use of p_oppid to restore the original parent/child
relationship, because real parent could already exited and its pid
reused (noted by mjg).

Add the function proc_realparent(9), which calculates the parent for
given process. It uses the flag P_TREE_FIRST_ORPHAN to detect the head
element of the p_orphan list and than stepping back to its container
to find the parent process. If the parent has already exited, the
init(8) is returned.

Move the P_ORPHAN and the new helper flag from the p_flag* to new
p_treeflag field of struct proc, which is protected by proctree lock
instead of proc lock, since the orphans relationship is managed under
the proctree_lock already.

The remaining uses of p_oppid in ptrace(PT_DETACH) and process
reapping are replaced by proc_realparent(9).

Phabric: D417
Reviewed by: jhb
Tested by: pho
Sponsored by: The FreeBSD Foundation
MFC after: 2 weeks
bin/ps/ps.1
sys/kern/kern_exit.c
sys/kern/kern_proc.c
sys/kern/sys_process.c
sys/sys/proc.h