Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 7 Nov 2020 13:09:51 +0000 (UTC)
From:      Edward Tomasz Napierala <trasz@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r367445 - head/sys/kern
Message-ID:  <202011071309.0A7D9pcm046517@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
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;
+			}
 		}
 	}
 



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202011071309.0A7D9pcm046517>