Author: kib
Date: Thu Feb 21 05:47:52 2013
New Revision: 247077
URL: http://svnweb.freebsd.org/changeset/base/247077

Log:
  MFC r246484:
  Allow ptrace(2) operation on the child created by vfork(2), if the
  debugger is not the parent.

Modified:
  stable/9/sys/kern/kern_exec.c
  stable/9/sys/kern/kern_exit.c
  stable/9/sys/kern/kern_sig.c
  stable/9/sys/kern/sys_process.c
  stable/9/sys/sys/proc.h
Directory Properties:
  stable/9/sys/   (props changed)

Modified: stable/9/sys/kern/kern_exec.c
==============================================================================
--- stable/9/sys/kern/kern_exec.c       Thu Feb 21 05:38:11 2013        
(r247076)
+++ stable/9/sys/kern/kern_exec.c       Thu Feb 21 05:47:52 2013        
(r247077)
@@ -646,7 +646,7 @@ interpret:
         */
        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: stable/9/sys/kern/kern_exit.c
==============================================================================
--- stable/9/sys/kern/kern_exit.c       Thu Feb 21 05:38:11 2013        
(r247076)
+++ stable/9/sys/kern/kern_exit.c       Thu Feb 21 05:47:52 2013        
(r247077)
@@ -259,7 +259,7 @@ exit1(struct thread *td, int rv)
        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: stable/9/sys/kern/kern_sig.c
==============================================================================
--- stable/9/sys/kern/kern_sig.c        Thu Feb 21 05:38:11 2013        
(r247076)
+++ stable/9/sys/kern/kern_sig.c        Thu Feb 21 05:47:52 2013        
(r247077)
@@ -2565,7 +2565,7 @@ issignal(struct thread *td, int stop_all
                        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: stable/9/sys/kern/sys_process.c
==============================================================================
--- stable/9/sys/kern/sys_process.c     Thu Feb 21 05:38:11 2013        
(r247076)
+++ stable/9/sys/kern/sys_process.c     Thu Feb 21 05:47:52 2013        
(r247077)
@@ -824,6 +824,8 @@ kern_ptrace(struct thread *td, int req, 
        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: stable/9/sys/sys/proc.h
==============================================================================
--- stable/9/sys/sys/proc.h     Thu Feb 21 05:38:11 2013        (r247076)
+++ stable/9/sys/sys/proc.h     Thu Feb 21 05:47:52 2013        (r247077)
@@ -636,6 +636,7 @@ struct proc {
 #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)
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to