summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjhb <jhb@FreeBSD.org>2015-09-16 20:55:00 +0000
committerjhb <jhb@FreeBSD.org>2015-09-16 20:55:00 +0000
commit9d7ff3e89e65c15fb8788a38a0f140100f740244 (patch)
treeb05e7ba8034419c44fd2f9a6a192b619b65145e9
parent776c19582f0b21866be8f85cf7b71f074dd358fc (diff)
downloadFreeBSD-src-9d7ff3e89e65c15fb8788a38a0f140100f740244.zip
FreeBSD-src-9d7ff3e89e65c15fb8788a38a0f140100f740244.tar.gz
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. Reviewed by: kib MFC after: 1 week Differential Revision: https://reviews.freebsd.org/D3678
-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 6d12b61..af09613 100644
--- a/sys/kern/subr_syscall.c
+++ b/sys/kern/subr_syscall.c
@@ -63,14 +63,14 @@ syscallenter(struct thread *td, struct syscall_args *sa)
td->td_pticks = 0;
if (td->td_cowgen != p->p_cowgen)
thread_cow_update(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