svn commit: r367445 - head/sys/kern

Edward Tomasz Napierala trasz at FreeBSD.org
Sat Nov 7 13:09:51 UTC 2020


Author: trasz
Date: Sat Nov  7 13:09:51 2020
New Revision: 367445
URL: https://svnweb.freebsd.org/changeset/base/367445

Log:
  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

Modified:
  head/sys/kern/subr_syscall.c

Modified: head/sys/kern/subr_syscall.c
==============================================================================
--- head/sys/kern/subr_syscall.c	Sat Nov  7 05:10:46 2020	(r367444)
+++ head/sys/kern/subr_syscall.c	Sat Nov  7 13:09:51 2020	(r367445)
@@ -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;
+			}
 		}
 	}
 


More information about the svn-src-all mailing list