? sys/arch/amd64/conf/KUBSAN ? sys/external/bsd/drm2/include/asm/bug.h.2 Index: sys/kern/kern_exec.c =================================================================== RCS file: /cvsroot/src/sys/kern/kern_exec.c,v retrieving revision 1.481 diff -u -r1.481 kern_exec.c --- sys/kern/kern_exec.c 17 Sep 2019 15:19:27 -0000 1.481 +++ sys/kern/kern_exec.c 30 Sep 2019 18:32:21 -0000 @@ -1339,7 +1339,7 @@ /* posix_spawn(3) reports a single event with implied exec(3) */ if ((p->p_slflag & PSL_TRACED) && !is_spawn) { mutex_enter(p->p_lock); - eventswitch(TRAP_EXEC); + eventswitch(TRAP_EXEC, 0, 0); mutex_enter(proc_lock); } @@ -2249,7 +2249,7 @@ } mutex_enter(p->p_lock); - eventswitch(TRAP_CHLD); + eventswitch(TRAP_CHLD, PTRACE_POSIX_SPAWN, p->p_oppid); } cpu_return: @@ -2630,8 +2630,7 @@ if ((p1->p_slflag & (PSL_TRACEPOSIX_SPAWN|PSL_TRACED)) == (PSL_TRACEPOSIX_SPAWN|PSL_TRACED)) { proc_changeparent(p2, p1->p_pptr); - p1->p_pspid = p2->p_pid; - p2->p_pspid = p1->p_pid; + p2->p_oppid = p1->p_pid; } LIST_INSERT_AFTER(p1, p2, p_pglist); @@ -2685,7 +2684,7 @@ } mutex_enter(p1->p_lock); - eventswitch(TRAP_CHLD); + eventswitch(TRAP_CHLD, PTRACE_POSIX_SPAWN, pid); } return 0; Index: sys/kern/kern_fork.c =================================================================== RCS file: /cvsroot/src/sys/kern/kern_fork.c,v retrieving revision 1.213 diff -u -r1.213 kern_fork.c --- sys/kern/kern_fork.c 13 Jun 2019 20:20:18 -0000 1.213 +++ sys/kern/kern_fork.c 30 Sep 2019 18:32:21 -0000 @@ -252,7 +252,6 @@ int count; vaddr_t uaddr; int tnprocs; - bool trace_fork, trace_vfork; int error = 0; p1 = l1->l_proc; @@ -511,17 +510,9 @@ /* * Trace fork(2) and vfork(2)-like events on demand in a debugger. */ - trace_fork = tracefork(p1, flags); - trace_vfork = tracevfork(p1, flags); - if (trace_fork || trace_vfork) + if (tracefork(p1, flags) || tracevfork(p1, flags)) { proc_changeparent(p2, p1->p_pptr); - if (trace_fork) { - p1->p_fpid = p2->p_pid; - p2->p_fpid = p1->p_pid; - } - if (trace_vfork) { - p1->p_vfpid = p2->p_pid; - p2->p_vfpid = p1->p_pid; + p2->p_oppid = p1->p_pid; } LIST_INSERT_AFTER(p1, p2, p_pglist); @@ -605,7 +596,9 @@ */ if (tracefork(p1, flags) || tracevfork(p1, flags)) { mutex_enter(p1->p_lock); - eventswitch(TRAP_CHLD); + eventswitch(TRAP_CHLD, + tracefork(p1, flags) ? PTRACE_FORK : PTRACE_VFORK, + retval[0]); mutex_enter(proc_lock); } @@ -621,8 +614,7 @@ */ if (tracevforkdone(p1, flags)) { mutex_enter(p1->p_lock); - p1->p_vfpid_done = retval[0]; - eventswitch(TRAP_CHLD); + eventswitch(TRAP_CHLD, PTRACE_VFORK_DONE, retval[0]); } else mutex_exit(proc_lock); @@ -645,9 +637,10 @@ mutex_exit(proc_lock); goto my_tracer_is_gone; } - mutex_enter(p->p_lock); - eventswitch(TRAP_CHLD); + eventswitch(TRAP_CHLD, + ISSET(p->p_lflag, PL_PPWAIT) ? PTRACE_VFORK : PTRACE_FORK, + p->p_oppid); } my_tracer_is_gone: Index: sys/kern/kern_lwp.c =================================================================== RCS file: /cvsroot/src/sys/kern/kern_lwp.c,v retrieving revision 1.202 diff -u -r1.202 kern_lwp.c --- sys/kern/kern_lwp.c 4 Jun 2019 11:54:03 -0000 1.202 +++ sys/kern/kern_lwp.c 30 Sep 2019 18:32:21 -0000 @@ -239,6 +239,7 @@ #include #include #include +#include #include #include #include @@ -1091,8 +1092,7 @@ * about a terminating LWP as it would deadlock. */ } else { - p->p_lwp_exited = l->l_lid; - eventswitch(TRAP_LWP); + eventswitch(TRAP_LWP, PTRACE_LWP_EXIT, l->l_lid); mutex_enter(proc_lock); } } Index: sys/kern/kern_proc.c =================================================================== RCS file: /cvsroot/src/sys/kern/kern_proc.c,v retrieving revision 1.234 diff -u -r1.234 kern_proc.c --- sys/kern/kern_proc.c 2 Aug 2019 22:46:44 -0000 1.234 +++ sys/kern/kern_proc.c 30 Sep 2019 18:32:22 -0000 @@ -2263,12 +2263,7 @@ COND_SET_VALUE(p->p_sigpend, psrc->p_sigpend, allowaddr); COND_SET_VALUE(p->p_lwpctl, psrc->p_lwpctl, allowaddr); p->p_ppid = psrc->p_ppid; - p->p_fpid = psrc->p_fpid; - p->p_vfpid = psrc->p_vfpid; - p->p_vfpid_done = psrc->p_vfpid_done; - p->p_lwp_created = psrc->p_lwp_created; - p->p_lwp_exited = psrc->p_lwp_exited; - p->p_pspid = psrc->p_pspid; + p->p_oppid = psrc->p_oppid; COND_SET_VALUE(p->p_path, psrc->p_path, allowaddr); COND_SET_VALUE(p->p_sigctx, psrc->p_sigctx, allowaddr); p->p_nice = psrc->p_nice; Index: sys/kern/kern_sig.c =================================================================== RCS file: /cvsroot/src/sys/kern/kern_sig.c,v retrieving revision 1.364 diff -u -r1.364 kern_sig.c --- sys/kern/kern_sig.c 21 Jun 2019 04:28:12 -0000 1.364 +++ sys/kern/kern_sig.c 30 Sep 2019 18:32:22 -0000 @@ -1560,7 +1560,7 @@ * an event specific to a traced process only. */ void -eventswitch(int code) +eventswitch(int code, int pe_report_event, int entity) { struct lwp *l = curlwp; struct proc *p = l->l_proc; @@ -1605,8 +1605,10 @@ KSI_INIT_TRAP(&ksi); ksi.ksi_lid = l->l_lid; - ksi.ksi_info._signo = signo; - ksi.ksi_info._code = code; + ksi.ksi_signo = signo; + ksi.ksi_code = code; + ksi.ksi_ptrace_state.pe_report_event = pe_report_event; + ksi.ksi_ptrace_state.pe_other_pid = entity; /* Needed for ktrace */ ps = p->p_sigacts; Index: sys/kern/sys_lwp.c =================================================================== RCS file: /cvsroot/src/sys/kern/sys_lwp.c,v retrieving revision 1.69 diff -u -r1.69 sys_lwp.c --- sys/kern/sys_lwp.c 10 Jul 2019 17:52:22 -0000 1.69 +++ sys/kern/sys_lwp.c 30 Sep 2019 18:32:22 -0000 @@ -45,6 +45,7 @@ #include #include #include +#include #include #include #include @@ -91,8 +92,7 @@ } mutex_enter(p->p_lock); - p->p_lwp_created = l->l_lid; - eventswitch(TRAP_LWP); + eventswitch(TRAP_LWP, PTRACE_LWP_CREATE, l->l_lid); } } Index: sys/kern/sys_ptrace_common.c =================================================================== RCS file: /cvsroot/src/sys/kern/sys_ptrace_common.c,v retrieving revision 1.58 diff -u -r1.58 sys_ptrace_common.c --- sys/kern/sys_ptrace_common.c 18 Jul 2019 20:10:46 -0000 1.58 +++ sys/kern/sys_ptrace_common.c 30 Sep 2019 18:32:23 -0000 @@ -694,27 +694,15 @@ DPRINTF(("%s: %zu != %zu\n", __func__, data, sizeof(ps))); return EINVAL; } - memset(&ps, 0, sizeof(ps)); - if (t->p_fpid) { - ps.pe_report_event = PTRACE_FORK; - ps.pe_other_pid = t->p_fpid; - } else if (t->p_vfpid) { - ps.pe_report_event = PTRACE_VFORK; - ps.pe_other_pid = t->p_vfpid; - } else if (t->p_vfpid_done) { - ps.pe_report_event = PTRACE_VFORK_DONE; - ps.pe_other_pid = t->p_vfpid_done; - } else if (t->p_lwp_created) { - ps.pe_report_event = PTRACE_LWP_CREATE; - ps.pe_lwp = t->p_lwp_created; - } else if (t->p_lwp_exited) { - ps.pe_report_event = PTRACE_LWP_EXIT; - ps.pe_lwp = t->p_lwp_exited; - } else if (t->p_pspid) { - ps.pe_report_event = PTRACE_POSIX_SPAWN; - ps.pe_other_pid = t->p_pspid; + if (t->p_sigctx.ps_info._signo != SIGTRAP || + (t->p_sigctx.ps_info._code != TRAP_CHLD && + t->p_sigctx.ps_info._code != TRAP_LWP)) { + return EINVAL; } + + ps = t->p_sigctx.ps_info._reason._ptrace_state; + DPRINTF(("%s: lwp=%d event=%#x pid=%d lwp=%d\n", __func__, t->p_sigctx.ps_lwp, ps.pe_report_event, ps.pe_other_pid, ps.pe_lwp)); @@ -894,13 +882,6 @@ { ksiginfo_t ksi; - t->p_fpid = 0; - t->p_vfpid = 0; - t->p_vfpid_done = 0; - t->p_lwp_created = 0; - t->p_lwp_exited = 0; - t->p_pspid = 0; - /* Finally, deliver the requested signal (or none). */ if (t->p_stat == SSTOP) { /* Index: sys/sys/proc.h =================================================================== RCS file: /cvsroot/src/sys/sys/proc.h,v retrieving revision 1.355 diff -u -r1.355 proc.h --- sys/sys/proc.h 15 Jul 2019 19:34:45 -0000 1.355 +++ sys/sys/proc.h 30 Sep 2019 18:32:24 -0000 @@ -311,12 +311,7 @@ sigpend_t p_sigpend; /* p: pending signals */ struct lcproc *p_lwpctl; /* p, a: _lwp_ctl() information */ pid_t p_ppid; /* :: cached parent pid */ - pid_t p_fpid; /* :: forked pid */ - pid_t p_vfpid; /* :: vforked pid */ - pid_t p_vfpid_done; /* :: vforked done pid */ - lwpid_t p_lwp_created; /* :: lwp created */ - lwpid_t p_lwp_exited; /* :: lwp exited */ - pid_t p_pspid; /* :: posix_spawn pid */ + pid_t p_oppid; /* :: cached original parent pid */ char *p_path; /* :: full pathname of executable */ /* Index: sys/sys/ptrace.h =================================================================== RCS file: /cvsroot/src/sys/sys/ptrace.h,v retrieving revision 1.65 diff -u -r1.65 ptrace.h --- sys/sys/ptrace.h 11 Jun 2019 23:18:55 -0000 1.65 +++ sys/sys/ptrace.h 30 Sep 2019 18:32:24 -0000 @@ -92,16 +92,10 @@ } ptrace_event_t; /* PT_GET_PROCESS_STATE */ -typedef struct ptrace_state { - int pe_report_event; - union { - pid_t _pe_other_pid; - lwpid_t _pe_lwp; - } _option; -} ptrace_state_t; +typedef struct ptrace_state ptrace_state_t; -#define pe_other_pid _option._pe_other_pid -#define pe_lwp _option._pe_lwp +#define pe_other_pid _option._pe_other_pid +#define pe_lwp _option._pe_lwp #define PTRACE_FORK 0x0001 /* Report forks */ #define PTRACE_VFORK 0x0002 /* Report vforks */ Index: sys/sys/siginfo.h =================================================================== RCS file: /cvsroot/src/sys/sys/siginfo.h,v retrieving revision 1.33 diff -u -r1.33 siginfo.h --- sys/sys/siginfo.h 6 May 2019 08:05:03 -0000 1.33 +++ sys/sys/siginfo.h 30 Sep 2019 18:32:24 -0000 @@ -32,6 +32,7 @@ #ifndef _SYS_SIGINFO_H_ #define _SYS_SIGINFO_H_ +#include #include #include #ifdef _KERNEL @@ -43,6 +44,14 @@ void *sival_ptr; } sigval_t; +struct ptrace_state { + int pe_report_event; + union { + pid_t _pe_other_pid; + lwpid_t _pe_lwp; + } _option; +}; + struct _ksiginfo { int _signo; int _code; @@ -84,6 +93,8 @@ int _error; uint64_t _args[8]; /* SYS_MAXSYSARGS */ } _syscall; + + struct ptrace_state _ptrace_state; } _reason; }; @@ -167,6 +178,8 @@ #define si_error _info._reason._syscall._error #define si_args _info._reason._syscall._args +#define si_ptrace_state _info._reason._ptrace_state + #ifdef _KERNEL /** Field access macros */ #define ksi_signo ksi_info._signo @@ -192,6 +205,8 @@ #define ksi_retval ksi_info._reason._syscall._retval #define ksi_error ksi_info._reason._syscall._error #define ksi_args ksi_info._reason._syscall._args + +#define ksi_ptrace_state ksi_info._reason._ptrace_state #endif /* _KERNEL */ /** si_code */ Index: sys/sys/signalvar.h =================================================================== RCS file: /cvsroot/src/sys/sys/signalvar.h,v retrieving revision 1.95 diff -u -r1.95 signalvar.h --- sys/sys/signalvar.h 8 Sep 2019 11:53:23 -0000 1.95 +++ sys/sys/signalvar.h 30 Sep 2019 18:32:24 -0000 @@ -152,7 +152,7 @@ void setsigvec(struct proc *, int, struct sigaction *); int killpg1(struct lwp *, struct ksiginfo *, int, int); void proc_unstop(struct proc *p); -void eventswitch(int); +void eventswitch(int, int, int); void sigswitch(int, int, bool);