diff options
author | jhb <jhb@FreeBSD.org> | 2015-10-07 00:50:26 +0000 |
---|---|---|
committer | jhb <jhb@FreeBSD.org> | 2015-10-07 00:50:26 +0000 |
commit | a68192dcd93aaca57130a3f76df9834b71b96e2d (patch) | |
tree | 46bae9a8b4706a255c2f5efe9ff024efbd60f34f /sys | |
parent | bda8562bdb1daad2e987d1ddfd01944cf1b719b0 (diff) | |
download | FreeBSD-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')
-rw-r--r-- | sys/kern/subr_syscall.c | 10 |
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)) |