summaryrefslogtreecommitdiffstats
path: root/sys/kern
diff options
context:
space:
mode:
authorjhb <jhb@FreeBSD.org>2015-10-07 00:50:26 +0000
committerjhb <jhb@FreeBSD.org>2015-10-07 00:50:26 +0000
commita68192dcd93aaca57130a3f76df9834b71b96e2d (patch)
tree46bae9a8b4706a255c2f5efe9ff024efbd60f34f /sys/kern
parentbda8562bdb1daad2e987d1ddfd01944cf1b719b0 (diff)
downloadFreeBSD-src-a68192dcd93aaca57130a3f76df9834b71b96e2d.zip
FreeBSD-src-a68192dcd93aaca57130a3f76df9834b71b96e2d.tar.gz
MFC 287870:
Always clear TDB_USERWR before fetching system call arguments. The TDB_USERWR flag may still be set after a debugger detaches from a process via PT_DETACH. Previously the flag would never be cleared forcing a double fetch of the system call arguments for each system call. Note that the flag cannot be cleared at PT_DETACH time in case one of the threads in the process is currently stopped in syscallenter() and the debugger has modified the arguments for that pending system call before detaching.
Diffstat (limited to 'sys/kern')
-rw-r--r--sys/kern/subr_syscall.c10
1 files changed, 5 insertions, 5 deletions
diff --git a/sys/kern/subr_syscall.c b/sys/kern/subr_syscall.c
index 9eeadb4..925d732 100644
--- a/sys/kern/subr_syscall.c
+++ b/sys/kern/subr_syscall.c
@@ -64,14 +64,14 @@ syscallenter(struct thread *td, struct syscall_args *sa)
td->td_pticks = 0;
if (td->td_ucred != p->p_ucred)
cred_update_thread(td);
- if (p->p_flag & P_TRACED) {
- traced = 1;
+ traced = (p->p_flag & P_TRACED) != 0;
+ if (traced || td->td_dbgflags & TDB_USERWR) {
PROC_LOCK(p);
td->td_dbgflags &= ~TDB_USERWR;
- td->td_dbgflags |= TDB_SCE;
+ if (traced)
+ td->td_dbgflags |= TDB_SCE;
PROC_UNLOCK(p);
- } else
- traced = 0;
+ }
error = (p->p_sysent->sv_fetch_syscall_args)(td, sa);
#ifdef KTRACE
if (KTRPOINT(td, KTR_SYSCALL))
OpenPOWER on IntegriCloud