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;
+                       }
                }
        }
 
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to