[Midnightbsd-cvs] src [8798] trunk/sys: allow ptrace(2) op on the child created by vfork(2) if the debugger is not present.

laffer1 at midnightbsd.org laffer1 at midnightbsd.org
Sun Sep 25 23:26:19 EDT 2016


Revision: 8798
          http://svnweb.midnightbsd.org/src/?rev=8798
Author:   laffer1
Date:     2016-09-25 23:26:19 -0400 (Sun, 25 Sep 2016)
Log Message:
-----------
allow ptrace(2) op on the child created by vfork(2) if the debugger is not present.

Modified Paths:
--------------
    trunk/sys/kern/kern_exec.c
    trunk/sys/kern/kern_exit.c
    trunk/sys/kern/kern_sig.c
    trunk/sys/kern/sys_process.c
    trunk/sys/sys/proc.h

Modified: trunk/sys/kern/kern_exec.c
===================================================================
--- trunk/sys/kern/kern_exec.c	2016-09-26 03:25:36 UTC (rev 8797)
+++ trunk/sys/kern/kern_exec.c	2016-09-26 03:26:19 UTC (rev 8798)
@@ -646,7 +646,7 @@
 	 */
 	p->p_flag |= P_EXEC;
 	if (p->p_pptr && (p->p_flag & P_PPWAIT)) {
-		p->p_flag &= ~P_PPWAIT;
+		p->p_flag &= ~(P_PPWAIT | P_PPTRACE);
 		cv_broadcast(&p->p_pwait);
 	}
 

Modified: trunk/sys/kern/kern_exit.c
===================================================================
--- trunk/sys/kern/kern_exit.c	2016-09-26 03:25:36 UTC (rev 8797)
+++ trunk/sys/kern/kern_exit.c	2016-09-26 03:26:19 UTC (rev 8798)
@@ -259,7 +259,7 @@
 	PROC_LOCK(p);
 	rv = p->p_xstat;	/* Event handler could change exit status */
 	stopprofclock(p);
-	p->p_flag &= ~(P_TRACED | P_PPWAIT);
+	p->p_flag &= ~(P_TRACED | P_PPWAIT | P_PPTRACE);
 
 	/*
 	 * Stop the real interval timer.  If the handler is currently

Modified: trunk/sys/kern/kern_sig.c
===================================================================
--- trunk/sys/kern/kern_sig.c	2016-09-26 03:25:36 UTC (rev 8797)
+++ trunk/sys/kern/kern_sig.c	2016-09-26 03:26:19 UTC (rev 8798)
@@ -2565,7 +2565,7 @@
 			sigqueue_delete(&p->p_sigqueue, sig);
 			continue;
 		}
-		if (p->p_flag & P_TRACED && (p->p_flag & P_PPWAIT) == 0) {
+		if (p->p_flag & P_TRACED && (p->p_flag & P_PPTRACE) == 0) {
 			/*
 			 * If traced, always stop.
 			 * Remove old signal from queue before the stop.

Modified: trunk/sys/kern/sys_process.c
===================================================================
--- trunk/sys/kern/sys_process.c	2016-09-26 03:25:36 UTC (rev 8797)
+++ trunk/sys/kern/sys_process.c	2016-09-26 03:26:19 UTC (rev 8798)
@@ -824,6 +824,8 @@
 	case PT_TRACE_ME:
 		/* set my trace flag and "owner" so it can read/write me */
 		p->p_flag |= P_TRACED;
+		if (p->p_flag & P_PPWAIT)
+			p->p_flag |= P_PPTRACE;
 		p->p_oppid = p->p_pptr->p_pid;
 		break;
 

Modified: trunk/sys/sys/proc.h
===================================================================
--- trunk/sys/sys/proc.h	2016-09-26 03:25:36 UTC (rev 8797)
+++ trunk/sys/sys/proc.h	2016-09-26 03:26:19 UTC (rev 8798)
@@ -639,6 +639,7 @@
 #define	P_INMEM		0x10000000 /* Loaded into memory. */
 #define	P_SWAPPINGOUT	0x20000000 /* Process is being swapped out. */
 #define	P_SWAPPINGIN	0x40000000 /* Process is being swapped in. */
+#define	P_PPTRACE	0x80000000 /* PT_TRACEME by vforked child. */
 
 #define	P_STOPPED	(P_STOPPED_SIG|P_STOPPED_SINGLE|P_STOPPED_TRACE)
 #define	P_SHOULDSTOP(p)	((p)->p_flag & P_STOPPED)



More information about the Midnightbsd-cvs mailing list