K 10 svn:author V 3 jhb K 8 svn:date V 27 2015-09-09T23:05:52.551589Z K 7 svn:log V 1617 MFC 269656,270024,270443,270993: Fix problems with orphan handling. Note that to preserve KBI, p_treeflag has been added to the end of struct proc and is explicitly zero'd during fork. 269656: 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). 270024: Correct the order of arguments passed to LIST_INSERT_AFTER(). 270443: Properly reparent traced processes when the tracer dies. Previously they were uncoditionally reparented to init. In effect it was possible that tracee was never returned to original parent. 270993: Fix up proc_realparent to always return correct process. Prior to the change it would always return initproc for non-traced processes. END