Module Name: src Committed By: ad Date: Sun Mar 1 21:37:27 UTC 2020
Modified Files: src/sys/kern: kern_fork.c Log Message: child_return(): - This was assuming arg == curlwp, but NULL is passed to lwp_create(), as evidenced by a random panic during testing. How did this ever work? - Replace a goto. To generate a diff of this commit: cvs rdiff -u -r1.218 -r1.219 src/sys/kern/kern_fork.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/kern/kern_fork.c diff -u src/sys/kern/kern_fork.c:1.218 src/sys/kern/kern_fork.c:1.219 --- src/sys/kern/kern_fork.c:1.218 Wed Jan 29 15:47:52 2020 +++ src/sys/kern/kern_fork.c Sun Mar 1 21:37:26 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: kern_fork.c,v 1.218 2020/01/29 15:47:52 ad Exp $ */ +/* $NetBSD: kern_fork.c,v 1.219 2020/03/01 21:37:26 ad Exp $ */ /*- * Copyright (c) 1999, 2001, 2004, 2006, 2007, 2008, 2019 @@ -68,7 +68,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: kern_fork.c,v 1.218 2020/01/29 15:47:52 ad Exp $"); +__KERNEL_RCSID(0, "$NetBSD: kern_fork.c,v 1.219 2020/03/01 21:37:26 ad Exp $"); #include "opt_ktrace.h" #include "opt_dtrace.h" @@ -627,23 +627,20 @@ fork1(struct lwp *l1, int flags, int exi void child_return(void *arg) { - struct lwp *l = arg; + struct lwp *l = curlwp; struct proc *p = l->l_proc; - if (p->p_slflag & PSL_TRACED) { + if ((p->p_slflag & PSL_TRACED) != 0) { /* Paranoid check */ mutex_enter(proc_lock); - if (!(p->p_slflag & PSL_TRACED)) { + if ((p->p_slflag & PSL_TRACED) != 0) { + mutex_enter(p->p_lock); + eventswitch(TRAP_CHLD, ISSET(p->p_lflag, PL_PPWAIT) ? + PTRACE_VFORK : PTRACE_FORK, p->p_opptr->p_pid); + } else mutex_exit(proc_lock); - goto my_tracer_is_gone; - } - mutex_enter(p->p_lock); - eventswitch(TRAP_CHLD, - ISSET(p->p_lflag, PL_PPWAIT) ? PTRACE_VFORK : PTRACE_FORK, - p->p_opptr->p_pid); } -my_tracer_is_gone: md_child_return(l); /*