Move TDB_USERWR check under 'if (traced)'.

If we hadn't been traced in the first place when syscallenter()
started executing, we can ignore TDB_USERWR.  TDB_USERWR can get set,
sure, but if it does, it's because the debugger raced with the syscall,
and it cannot depend on winning that race.

Reviewed by:	kib
MFC after:	2 weeks
Sponsored by:	EPSRC
Differential Revision:	https://reviews.freebsd.org/D26585
This commit is contained in:
Edward Tomasz Napierala 2020-11-07 13:09:51 +00:00
parent 2192cd125f
commit da45ea6bc6
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=367445

View File

@ -97,21 +97,22 @@ syscallenter(struct thread *td)
if (p->p_ptevents & PTRACE_SCE) if (p->p_ptevents & PTRACE_SCE)
ptracestop((td), SIGTRAP, NULL); ptracestop((td), SIGTRAP, NULL);
PROC_UNLOCK(p); PROC_UNLOCK(p);
}
if (__predict_false((td->td_dbgflags & TDB_USERWR) != 0)) { if ((td->td_dbgflags & TDB_USERWR) != 0) {
/* /*
* Reread syscall number and arguments if debugger * Reread syscall number and arguments if debugger
* modified registers or memory. * modified registers or memory.
*/ */
error = (p->p_sysent->sv_fetch_syscall_args)(td); error = (p->p_sysent->sv_fetch_syscall_args)(td);
se = sa->callp; se = sa->callp;
#ifdef KTRACE #ifdef KTRACE
if (KTRPOINT(td, KTR_SYSCALL)) if (KTRPOINT(td, KTR_SYSCALL))
ktrsyscall(sa->code, se->sy_narg, sa->args); ktrsyscall(sa->code, se->sy_narg, sa->args);
#endif #endif
if (error != 0) { if (error != 0) {
td->td_errno = error; td->td_errno = error;
goto retval; goto retval;
}
} }
} }