summaryrefslogtreecommitdiffstats
path: root/sys/kern/kern_sig.c
diff options
context:
space:
mode:
authordavidxu <davidxu@FreeBSD.org>2012-07-10 05:45:13 +0000
committerdavidxu <davidxu@FreeBSD.org>2012-07-10 05:45:13 +0000
commitaffa007492a48a932270fa09d078b224f6dda6c7 (patch)
treebe38983427d66232a7c06e73ce7bdd4a8cb97715 /sys/kern/kern_sig.c
parent73d0ae1bbf2801a62d303c2066c0a4d034b5a3bb (diff)
downloadFreeBSD-src-affa007492a48a932270fa09d078b224f6dda6c7.zip
FreeBSD-src-affa007492a48a932270fa09d078b224f6dda6c7.tar.gz
Always clear p_xthread if current thread no longer needs it, in theory, if
debugger exited without calling ptrace(PT_DETACH), there is a time window that the p_xthread may be pointing to non-existing thread, in practical, this is not a problem because child process soon will be killed by parent process.
Diffstat (limited to 'sys/kern/kern_sig.c')
-rw-r--r--sys/kern/kern_sig.c5
1 files changed, 3 insertions, 2 deletions
diff --git a/sys/kern/kern_sig.c b/sys/kern/kern_sig.c
index 52a0c40..2685a8b 100644
--- a/sys/kern/kern_sig.c
+++ b/sys/kern/kern_sig.c
@@ -2436,9 +2436,10 @@ ptracestop(struct thread *td, int sig)
}
stopme:
thread_suspend_switch(td);
- if (!(p->p_flag & P_TRACED)) {
+ if (p->p_xthread == td)
+ p->p_xthread = NULL;
+ if (!(p->p_flag & P_TRACED))
break;
- }
if (td->td_dbgflags & TDB_SUSPEND) {
if (p->p_flag & P_SINGLE_EXIT)
break;
OpenPOWER on IntegriCloud