Module Name:    src
Committed By:   kamil
Date:           Thu May  7 20:02:34 UTC 2020

Modified Files:
        src/sys/kern: kern_exec.c kern_fork.c kern_sig.c
        src/sys/sys: proc.h

Log Message:
On debugger attach to a prestarted process don't report SIGTRAP

Introduce PSL_TRACEDCHILD that indicates tracking of birth of a process.
A freshly forked process checks whether it is traced and if so, reports
SIGTRAP + TRAP_CHLD event to a debugger as a result of tracking forks-like
events. There is a time window when a debugger can attach to a newly
created process and receive SIGTRAP + TRAP_CHLD instead of SIGSTOP.

Fixes races in t_ptrace_wait* tests when a test hangs or misbehaves,
especially the ones reported in tracer_sysctl_lookup_without_duplicates.


To generate a diff of this commit:
cvs rdiff -u -r1.499 -r1.500 src/sys/kern/kern_exec.c
cvs rdiff -u -r1.223 -r1.224 src/sys/kern/kern_fork.c
cvs rdiff -u -r1.387 -r1.388 src/sys/kern/kern_sig.c
cvs rdiff -u -r1.364 -r1.365 src/sys/sys/proc.h

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/kern/kern_exec.c
diff -u src/sys/kern/kern_exec.c:1.499 src/sys/kern/kern_exec.c:1.500
--- src/sys/kern/kern_exec.c:1.499	Fri Apr 24 03:22:06 2020
+++ src/sys/kern/kern_exec.c	Thu May  7 20:02:34 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: kern_exec.c,v 1.499 2020/04/24 03:22:06 thorpej Exp $	*/
+/*	$NetBSD: kern_exec.c,v 1.500 2020/05/07 20:02:34 kamil Exp $	*/
 
 /*-
  * Copyright (c) 2008, 2019, 2020 The NetBSD Foundation, Inc.
@@ -62,7 +62,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: kern_exec.c,v 1.499 2020/04/24 03:22:06 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: kern_exec.c,v 1.500 2020/05/07 20:02:34 kamil Exp $");
 
 #include "opt_exec.h"
 #include "opt_execfmt.h"
@@ -2279,8 +2279,10 @@ spawn_return(void *arg)
 	/* release our refcount on the data */
 	spawn_exec_data_release(spawn_data);
 
-	if (p->p_slflag & PSL_TRACED)
+	if ((p->p_slflag & (PSL_TRACED|PSL_TRACEDCHILD)) ==
+	    (PSL_TRACED|PSL_TRACEDCHILD)) {
 		eventswitchchild(p, TRAP_CHLD, PTRACE_POSIX_SPAWN);
+	}
 
 	/* and finally: leave to userland for the first time */
 	cpu_spawn_return(l);
@@ -2664,8 +2666,10 @@ do_posix_spawn(struct lwp *l1, pid_t *pi
 	p2->p_exitsig = SIGCHLD;	/* signal for parent on exit */
 
 	if ((p1->p_slflag & (PSL_TRACEPOSIX_SPAWN|PSL_TRACED)) ==
-	    (PSL_TRACEPOSIX_SPAWN|PSL_TRACED))
+	    (PSL_TRACEPOSIX_SPAWN|PSL_TRACED)) {
 		proc_changeparent(p2, p1->p_pptr);
+		SET(p2->p_slflag, PSL_TRACEDCHILD);
+	}
 
 	p2->p_oppid = p1->p_pid;  /* Remember the original parent id. */
 

Index: src/sys/kern/kern_fork.c
diff -u src/sys/kern/kern_fork.c:1.223 src/sys/kern/kern_fork.c:1.224
--- src/sys/kern/kern_fork.c:1.223	Fri Apr 24 03:22:06 2020
+++ src/sys/kern/kern_fork.c	Thu May  7 20:02:34 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: kern_fork.c,v 1.223 2020/04/24 03:22:06 thorpej Exp $	*/
+/*	$NetBSD: kern_fork.c,v 1.224 2020/05/07 20:02:34 kamil Exp $	*/
 
 /*-
  * Copyright (c) 1999, 2001, 2004, 2006, 2007, 2008, 2019
@@ -68,7 +68,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: kern_fork.c,v 1.223 2020/04/24 03:22:06 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: kern_fork.c,v 1.224 2020/05/07 20:02:34 kamil Exp $");
 
 #include "opt_ktrace.h"
 #include "opt_dtrace.h"
@@ -513,8 +513,10 @@ fork1(struct lwp *l1, int flags, int exi
 	/*
 	 * Trace fork(2) and vfork(2)-like events on demand in a debugger.
 	 */
-	if (tracefork(p1, flags) || tracevfork(p1, flags))
+	if (tracefork(p1, flags) || tracevfork(p1, flags)) {
 		proc_changeparent(p2, p1->p_pptr);
+		SET(p2->p_slflag, PSL_TRACEDCHILD);
+	}
 
 	p2->p_oppid = p1->p_pid; /* Remember the original parent id. */
 
@@ -634,7 +636,8 @@ child_return(void *arg)
 	struct lwp *l = curlwp;
 	struct proc *p = l->l_proc;
 
-	if ((p->p_slflag & PSL_TRACED) != 0) {
+	if ((p->p_slflag & (PSL_TRACED|PSL_TRACEDCHILD)) ==
+	    (PSL_TRACED|PSL_TRACEDCHILD)) {
 		eventswitchchild(p, TRAP_CHLD, 
 		    ISSET(p->p_lflag, PL_PPWAIT) ? PTRACE_VFORK : PTRACE_FORK);
 	}

Index: src/sys/kern/kern_sig.c
diff -u src/sys/kern/kern_sig.c:1.387 src/sys/kern/kern_sig.c:1.388
--- src/sys/kern/kern_sig.c:1.387	Mon Apr  6 08:20:05 2020
+++ src/sys/kern/kern_sig.c	Thu May  7 20:02:34 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: kern_sig.c,v 1.387 2020/04/06 08:20:05 kamil Exp $	*/
+/*	$NetBSD: kern_sig.c,v 1.388 2020/05/07 20:02:34 kamil Exp $	*/
 
 /*-
  * Copyright (c) 2006, 2007, 2008, 2019 The NetBSD Foundation, Inc.
@@ -70,7 +70,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: kern_sig.c,v 1.387 2020/04/06 08:20:05 kamil Exp $");
+__KERNEL_RCSID(0, "$NetBSD: kern_sig.c,v 1.388 2020/05/07 20:02:34 kamil Exp $");
 
 #include "opt_ptrace.h"
 #include "opt_dtrace.h"
@@ -1693,7 +1693,8 @@ eventswitchchild(struct proc *p, int cod
 {
 	mutex_enter(proc_lock);
 	mutex_enter(p->p_lock);
-	if (!(p->p_slflag & PSL_TRACED)) {
+	if ((p->p_slflag & (PSL_TRACED|PSL_TRACEDCHILD)) !=
+	    (PSL_TRACED|PSL_TRACEDCHILD)) {
 		mutex_exit(p->p_lock);
 		mutex_exit(proc_lock);
 		return;

Index: src/sys/sys/proc.h
diff -u src/sys/sys/proc.h:1.364 src/sys/sys/proc.h:1.365
--- src/sys/sys/proc.h:1.364	Wed Apr 29 01:52:26 2020
+++ src/sys/sys/proc.h	Thu May  7 20:02:34 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: proc.h,v 1.364 2020/04/29 01:52:26 thorpej Exp $	*/
+/*	$NetBSD: proc.h,v 1.365 2020/05/07 20:02:34 kamil Exp $	*/
 
 /*-
  * Copyright (c) 2006, 2007, 2008, 2020 The NetBSD Foundation, Inc.
@@ -413,6 +413,7 @@ struct proc {
 			0x00000020 /* traced process wants posix_spawn events */
 
 #define	PSL_TRACED	0x00000800 /* Debugged process being traced */
+#define	PSL_TRACEDCHILD 0x00001000 /* Report process birth */
 #define	PSL_CHTRACED	0x00400000 /* Child has been traced & reparented */
 #define	PSL_SYSCALL	0x04000000 /* process has PT_SYSCALL enabled */
 #define	PSL_SYSCALLEMU	0x08000000 /* cancel in-progress syscall */

Reply via email to