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)
ptracestop((td), SIGTRAP, NULL);
PROC_UNLOCK(p);
}
if (__predict_false((td->td_dbgflags & TDB_USERWR) != 0)) {
/*
* Reread syscall number and arguments if debugger
* modified registers or memory.
*/
error = (p->p_sysent->sv_fetch_syscall_args)(td);
se = sa->callp;
if ((td->td_dbgflags & TDB_USERWR) != 0) {
/*
* Reread syscall number and arguments if debugger
* modified registers or memory.
*/
error = (p->p_sysent->sv_fetch_syscall_args)(td);
se = sa->callp;
#ifdef KTRACE
if (KTRPOINT(td, KTR_SYSCALL))
ktrsyscall(sa->code, se->sy_narg, sa->args);
if (KTRPOINT(td, KTR_SYSCALL))
ktrsyscall(sa->code, se->sy_narg, sa->args);
#endif
if (error != 0) {
td->td_errno = error;
goto retval;
if (error != 0) {
td->td_errno = error;
goto retval;
}
}
}