summaryrefslogtreecommitdiffstats
path: root/sys/kern/subr_syscall.c
diff options
context:
space:
mode:
authorjhb <jhb@FreeBSD.org>2016-08-19 20:17:57 +0000
committerjhb <jhb@FreeBSD.org>2016-08-19 20:17:57 +0000
commitc9c29af8f1b4e33db84e9f99dba31cbb3930ce27 (patch)
treee1149353458936ff42f8fab9543a52b808dffd5b /sys/kern/subr_syscall.c
parent775a4f56bb501897de60548401534fc23e14d9dc (diff)
downloadFreeBSD-src-c9c29af8f1b4e33db84e9f99dba31cbb3930ce27.zip
FreeBSD-src-c9c29af8f1b4e33db84e9f99dba31cbb3930ce27.tar.gz
MFC 303001: Add PTRACE_VFORK to trace vfork events.
First, PL_FLAG_FORKED events now also set a PL_FLAG_VFORKED flag when the new child was created via vfork() rather than fork(). Second, a new PL_FLAG_VFORK_DONE event can now be enabled via the PTRACE_VFORK event mask. This new stop is reported after the vfork parent resumes due to the child calling exit or exec. Debuggers can use this stop to reinsert breakpoints in the vfork parent process before it resumes.
Diffstat (limited to 'sys/kern/subr_syscall.c')
-rw-r--r--sys/kern/subr_syscall.c8
1 files changed, 8 insertions, 0 deletions
diff --git a/sys/kern/subr_syscall.c b/sys/kern/subr_syscall.c
index f2b83f0..201d876 100644
--- a/sys/kern/subr_syscall.c
+++ b/sys/kern/subr_syscall.c
@@ -249,5 +249,13 @@ again:
cv_timedwait(&p2->p_pwait, &p2->p_mtx, hz);
}
PROC_UNLOCK(p2);
+
+ if (td->td_dbgflags & TDB_VFORK) {
+ PROC_LOCK(p);
+ if (p->p_ptevents & PTRACE_VFORK)
+ ptracestop(td, SIGTRAP);
+ td->td_dbgflags &= ~TDB_VFORK;
+ PROC_UNLOCK(p);
+ }
}
}
OpenPOWER on IntegriCloud