diff options
author | davidxu <davidxu@FreeBSD.org> | 2012-07-10 05:45:13 +0000 |
---|---|---|
committer | davidxu <davidxu@FreeBSD.org> | 2012-07-10 05:45:13 +0000 |
commit | affa007492a48a932270fa09d078b224f6dda6c7 (patch) | |
tree | be38983427d66232a7c06e73ce7bdd4a8cb97715 /sys/kern/kern_sig.c | |
parent | 73d0ae1bbf2801a62d303c2066c0a4d034b5a3bb (diff) | |
download | FreeBSD-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.c | 5 |
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; |