diff options
author | David Schultz <das@FreeBSD.org> | 2005-04-10 02:31:24 +0000 |
---|---|---|
committer | David Schultz <das@FreeBSD.org> | 2005-04-10 02:31:24 +0000 |
commit | f97c3df18decb837eca280b25eccedcb1c81ee16 (patch) | |
tree | 165ccabd054b6478825428998a06587d4d4a4118 | |
parent | 11853de0a109d330dccb4b9b8f594516302e8923 (diff) |
Notes
-rw-r--r-- | sys/kern/kern_sig.c | 12 |
1 files changed, 11 insertions, 1 deletions
diff --git a/sys/kern/kern_sig.c b/sys/kern/kern_sig.c index 7928120f9760..71427d7f2ce1 100644 --- a/sys/kern/kern_sig.c +++ b/sys/kern/kern_sig.c @@ -2430,7 +2430,16 @@ sigexit(td, sig) PROC_LOCK_ASSERT(p, MA_OWNED); p->p_acflag |= AXSIG; - if (sigprop(sig) & SA_CORE) { + /* + * We must be single-threading to generate a core dump. This + * ensures that the registers in the core file are up-to-date. + * Also, the ELF dump handler assumes that the thread list doesn't + * change out from under it. + * + * XXX If another thread attempts to single-thread before us + * (e.g. via fork()), we won't get a dump at all. + */ + if ((sigprop(sig) & SA_CORE) && (thread_single(SINGLE_NO_EXIT) == 0)) { p->p_sig = sig; /* * Log signals which would cause core dumps @@ -2553,6 +2562,7 @@ coredump(struct thread *td) off_t limit; PROC_LOCK_ASSERT(p, MA_OWNED); + MPASS((p->p_flag & P_HADTHREADS) == 0 || p->p_singlethread == td); _STOPEVENT(p, S_CORE, 0); if (((sugid_coredump == 0) && p->p_flag & P_SUGID) || do_coredump == 0) { |