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