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:
parent
2192cd125f
commit
da45ea6bc6
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=367445
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user