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 | |
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.
-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)) |