Module Name:    src
Committed By:   martin
Date:           Fri Mar 31 08:47:04 UTC 2017

Modified Files:
        src/sys/arch/x86/x86: syscall.c
        src/sys/kern: kern_fork.c kern_sig.c

Log Message:
PR kern/52117: move stop code for debuged children after fork into MI code.
XXX we might want to revisit this when handling the same event for vfork
better.


To generate a diff of this commit:
cvs rdiff -u -r1.14 -r1.15 src/sys/arch/x86/x86/syscall.c
cvs rdiff -u -r1.199 -r1.200 src/sys/kern/kern_fork.c
cvs rdiff -u -r1.334 -r1.335 src/sys/kern/kern_sig.c

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

Modified files:

Index: src/sys/arch/x86/x86/syscall.c
diff -u src/sys/arch/x86/x86/syscall.c:1.14 src/sys/arch/x86/x86/syscall.c:1.15
--- src/sys/arch/x86/x86/syscall.c:1.14	Thu Jul  7 06:55:40 2016
+++ src/sys/arch/x86/x86/syscall.c	Fri Mar 31 08:47:04 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: syscall.c,v 1.14 2016/07/07 06:55:40 msaitoh Exp $	*/
+/*	$NetBSD: syscall.c,v 1.15 2017/03/31 08:47:04 martin Exp $	*/
 
 /*-
  * Copyright (c) 1998, 2000, 2009 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: syscall.c,v 1.14 2016/07/07 06:55:40 msaitoh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: syscall.c,v 1.15 2017/03/31 08:47:04 martin Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -65,18 +65,6 @@ child_return(void *arg)
 {
 	struct lwp *l = arg;
 	struct trapframe *tf = l->l_md.md_regs;
-	struct proc *p = l->l_proc;
-
-	if (p->p_slflag & PSL_TRACED) {
-		ksiginfo_t ksi;
-
-		mutex_enter(proc_lock);
-                KSI_INIT_EMPTY(&ksi);
-                ksi.ksi_signo = SIGTRAP;
-                ksi.ksi_lid = l->l_lid;
-                kpsignal(p, &ksi, NULL);
-		mutex_exit(proc_lock);
-	}
 
 	X86_TF_RAX(tf) = 0;
 	X86_TF_RFLAGS(tf) &= ~PSL_C;

Index: src/sys/kern/kern_fork.c
diff -u src/sys/kern/kern_fork.c:1.199 src/sys/kern/kern_fork.c:1.200
--- src/sys/kern/kern_fork.c:1.199	Fri Jan 13 23:00:35 2017
+++ src/sys/kern/kern_fork.c	Fri Mar 31 08:47:04 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: kern_fork.c,v 1.199 2017/01/13 23:00:35 kamil Exp $	*/
+/*	$NetBSD: kern_fork.c,v 1.200 2017/03/31 08:47:04 martin Exp $	*/
 
 /*-
  * Copyright (c) 1999, 2001, 2004, 2006, 2007, 2008 The NetBSD Foundation, Inc.
@@ -67,7 +67,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: kern_fork.c,v 1.199 2017/01/13 23:00:35 kamil Exp $");
+__KERNEL_RCSID(0, "$NetBSD: kern_fork.c,v 1.200 2017/03/31 08:47:04 martin Exp $");
 
 #include "opt_ktrace.h"
 #include "opt_dtrace.h"
@@ -500,6 +500,17 @@ fork1(struct lwp *l1, int flags, int exi
 	(*p2->p_emul->e_syscall_intern)(p2);
 #endif
 
+	/* if we are being traced, give the owner a chance to interfere */
+	if (p2->p_slflag & PSL_TRACED) {
+		ksiginfo_t ksi;
+
+                KSI_INIT_EMPTY(&ksi);
+		ksi.ksi_signo = SIGTRAP;
+		ksi.ksi_code = TRAP_CHLD;
+		ksi.ksi_lid = l2->l_lid;
+		kpsignal(p2, &ksi, NULL);
+	}
+
 	/*
 	 * Update stats now that we know the fork was successful.
 	 */

Index: src/sys/kern/kern_sig.c
diff -u src/sys/kern/kern_sig.c:1.334 src/sys/kern/kern_sig.c:1.335
--- src/sys/kern/kern_sig.c:1.334	Fri Mar 24 17:40:44 2017
+++ src/sys/kern/kern_sig.c	Fri Mar 31 08:47:04 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: kern_sig.c,v 1.334 2017/03/24 17:40:44 christos Exp $	*/
+/*	$NetBSD: kern_sig.c,v 1.335 2017/03/31 08:47:04 martin Exp $	*/
 
 /*-
  * Copyright (c) 2006, 2007, 2008 The NetBSD Foundation, Inc.
@@ -70,7 +70,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: kern_sig.c,v 1.334 2017/03/24 17:40:44 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: kern_sig.c,v 1.335 2017/03/31 08:47:04 martin Exp $");
 
 #include "opt_ptrace.h"
 #include "opt_dtrace.h"
@@ -1224,7 +1224,7 @@ kpsignal2(struct proc *p, ksiginfo_t *ks
 	ksiginfo_t *kp;
 	lwpid_t lid;
 	sig_t action;
-	bool toall;
+	bool toall, debtrap = false;
 	int error = 0;
 
 	KASSERT(!cpu_intr_p());
@@ -1237,8 +1237,13 @@ kpsignal2(struct proc *p, ksiginfo_t *ks
 	 * If the process is being created by fork, is a zombie or is
 	 * exiting, then just drop the signal here and bail out.
 	 */
-	if (p->p_stat != SACTIVE && p->p_stat != SSTOP)
+	if (p->p_stat == SIDL && signo == SIGTRAP
+	    && (p->p_slflag & PSL_TRACED)) {
+		/* allow an initial SIGTRAP for traced processes */
+		debtrap = true;
+	} else if (p->p_stat != SACTIVE && p->p_stat != SSTOP) {
 		return 0;
+	}
 
 	/* XXX for core dump/debugger */
 	p->p_sigctx.ps_lwp = ksi->ksi_lid;
@@ -1353,7 +1358,13 @@ kpsignal2(struct proc *p, ksiginfo_t *ks
 	 * the signal to it.
 	 */
 	if (lid != 0) {
-		l = lwp_find(p, lid);
+		if (__predict_false(debtrap)) {
+			l = LIST_FIRST(&p->p_lwps);
+			if (l->l_lid != lid)
+				l = NULL;
+		} else {
+			l = lwp_find(p, lid);
+		}
 		if (l != NULL) {
 			if ((error = sigput(&l->l_sigpend, p, kp)) != 0)
 				goto out;

Reply via email to