Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys On debugger attach to a prestarted process don't report ...



details:   https://anonhg.NetBSD.org/src/rev/4579f5e6cceb
branches:  trunk
changeset: 932463:4579f5e6cceb
user:      kamil <kamil%NetBSD.org@localhost>
date:      Thu May 07 20:02:34 2020 +0000

description:
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.

diffstat:

 sys/kern/kern_exec.c |  12 ++++++++----
 sys/kern/kern_fork.c |  11 +++++++----
 sys/kern/kern_sig.c  |   7 ++++---
 sys/sys/proc.h       |   3 ++-
 4 files changed, 21 insertions(+), 12 deletions(-)

diffs (127 lines):

diff -r 41c41f1c4e16 -r 4579f5e6cceb sys/kern/kern_exec.c
--- a/sys/kern/kern_exec.c      Thu May 07 20:01:04 2020 +0000
+++ b/sys/kern/kern_exec.c      Thu May 07 20:02:34 2020 +0000
@@ -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 @@
        /* 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 @@
        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. */
 
diff -r 41c41f1c4e16 -r 4579f5e6cceb sys/kern/kern_fork.c
--- a/sys/kern/kern_fork.c      Thu May 07 20:01:04 2020 +0000
+++ b/sys/kern/kern_fork.c      Thu May 07 20:02:34 2020 +0000
@@ -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 @@
        /*
         * 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 @@
        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);
        }
diff -r 41c41f1c4e16 -r 4579f5e6cceb sys/kern/kern_sig.c
--- a/sys/kern/kern_sig.c       Thu May 07 20:01:04 2020 +0000
+++ b/sys/kern/kern_sig.c       Thu May 07 20:02:34 2020 +0000
@@ -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 @@
 {
        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;
diff -r 41c41f1c4e16 -r 4579f5e6cceb sys/sys/proc.h
--- a/sys/sys/proc.h    Thu May 07 20:01:04 2020 +0000
+++ b/sys/sys/proc.h    Thu May 07 20:02:34 2020 +0000
@@ -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 @@
                        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 */



Home | Main Index | Thread Index | Old Index