summaryrefslogtreecommitdiffstats
path: root/sys/kern/sys_process.c
diff options
context:
space:
mode:
authormpi <mpi@openbsd.org>2020-03-16 11:58:46 +0000
committermpi <mpi@openbsd.org>2020-03-16 11:58:46 +0000
commit8fb2af3abc3ad848e70f6ddec0c3b4bd7f12e036 (patch)
tree695b499af4ba9de7ebfc09b409b5258a23094122 /sys/kern/sys_process.c
parentVTE treats each mouse mode bit as independent, so turning off 1000 (diff)
downloadwireguard-openbsd-8fb2af3abc3ad848e70f6ddec0c3b4bd7f12e036.tar.xz
wireguard-openbsd-8fb2af3abc3ad848e70f6ddec0c3b4bd7f12e036.zip
Keep track of traced child under a list of orphans while they are being
reparented to a debugger process. Also re-parent exiting traced processes to their original parent, if it is still alive, after the debugger has seen the exit status. Logic comes from FreeBSD pointed out by guenther@. While here rename proc_reparent() into process_reparent() and get rid of superfluous checks. ok visa@
Diffstat (limited to 'sys/kern/sys_process.c')
-rw-r--r--sys/kern/sys_process.c18
1 files changed, 4 insertions, 14 deletions
diff --git a/sys/kern/sys_process.c b/sys/kern/sys_process.c
index 513ccd24d28..9481d6a7424 100644
--- a/sys/kern/sys_process.c
+++ b/sys/kern/sys_process.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: sys_process.c,v 1.82 2019/12/11 07:30:09 guenther Exp $ */
+/* $OpenBSD: sys_process.c,v 1.83 2020/03/16 11:58:46 mpi Exp $ */
/* $NetBSD: sys_process.c,v 1.55 1996/05/15 06:17:47 tls Exp $ */
/*-
@@ -476,17 +476,8 @@ ptrace_ctrl(struct proc *p, int req, pid_t pid, caddr_t addr, int data)
goto fail;
#endif
- /* give process back to original parent or init */
- if (tr->ps_oppid != tr->ps_pptr->ps_pid) {
- struct process *ppr;
-
- ppr = prfind(tr->ps_oppid);
- proc_reparent(tr, ppr ? ppr : initprocess);
- }
-
- /* not being traced any more */
- tr->ps_oppid = 0;
- atomic_clearbits_int(&tr->ps_flags, PS_TRACED|PS_WAITED);
+ process_untrace(tr);
+ atomic_clearbits_int(&tr->ps_flags, PS_WAITED);
sendsig:
memset(tr->ps_ptstat, 0, sizeof(*tr->ps_ptstat));
@@ -523,8 +514,7 @@ ptrace_ctrl(struct proc *p, int req, pid_t pid, caddr_t addr, int data)
*/
atomic_setbits_int(&tr->ps_flags, PS_TRACED);
tr->ps_oppid = tr->ps_pptr->ps_pid;
- if (tr->ps_pptr != p->p_p)
- proc_reparent(tr, p->p_p);
+ process_reparent(tr, p->p_p);
if (tr->ps_ptstat == NULL)
tr->ps_ptstat = malloc(sizeof(*tr->ps_ptstat),
M_SUBPROC, M_WAITOK);