kernel - Fix getpid() issue in vfork() when threaded
authorMatthew Dillon <dillon@apollo.backplane.com>
Thu, 28 Jul 2016 16:39:57 +0000 (09:39 -0700)
committerMatthew Dillon <dillon@apollo.backplane.com>
Thu, 28 Jul 2016 16:42:47 +0000 (09:42 -0700)
* upmap->invfork was a 0 or 1, but in a threaded program it is possible
  for multiple threads to be in vfork() at the same time.  Change invfork
  to a count.

* Fixes improper getpid() return when concurrent vfork()s are occuring in
  a threaded program.

sys/kern/kern_exec.c
sys/kern/kern_exit.c
sys/kern/kern_fork.c

index 17be7f4..454ee94 100644 (file)
@@ -425,7 +425,7 @@ interpret:
        p->p_flags |= P_EXEC;
        if (p->p_pptr && (p->p_flags & P_PPWAIT)) {
                if (p->p_pptr->p_upmap)
-                       p->p_pptr->p_upmap->invfork = 0;
+                       atomic_add_int(&p->p_pptr->p_upmap->invfork, -1);
                atomic_clear_int(&p->p_flags, P_PPWAIT);
                wakeup(p->p_pptr);
        }
index aeee8fd..a1c7b86 100644 (file)
@@ -498,7 +498,7 @@ exit1(int rv)
         */
        if (p->p_flags & P_PPWAIT) {
                if (p->p_pptr && p->p_pptr->p_upmap)
-                       p->p_pptr->p_upmap->invfork = 0;
+                       atomic_add_int(&p->p_pptr->p_upmap->invfork, -1);
                atomic_clear_int(&p->p_flags, P_PPWAIT);
                wakeup(p->p_pptr);
        }
index 217193b..7891b68 100644 (file)
@@ -522,7 +522,7 @@ fork1(struct lwp *lp1, int flags, struct proc **procp)
        if (flags & RFPPWAIT) {
                p2->p_flags |= P_PPWAIT;
                if (p1->p_upmap)
-                       p1->p_upmap->invfork = 1;
+                       atomic_add_int(&p1->p_upmap->invfork, 1);
        }