summaryrefslogtreecommitdiffstats
path: root/sys/kern/kern_fork.c
diff options
context:
space:
mode:
authorguenther <guenther@openbsd.org>2008-10-09 06:31:53 +0000
committerguenther <guenther@openbsd.org>2008-10-09 06:31:53 +0000
commit5de831d5975031cedc04a30f1f47cd7c4c9b119f (patch)
treec0eb31105d3fe896ea9f21a93003523c50b38365 /sys/kern/kern_fork.c
parentsupport setting PermitEmptyPasswords in a Match block (diff)
downloadwireguard-openbsd-5de831d5975031cedc04a30f1f47cd7c4c9b119f.tar.xz
wireguard-openbsd-5de831d5975031cedc04a30f1f47cd7c4c9b119f.zip
Put a reference count in struct process to prevent use-after-free
if the main thread reaches the reaper ahead of some other thread in the process. ok art@ tedu@
Diffstat (limited to 'sys/kern/kern_fork.c')
-rw-r--r--sys/kern/kern_fork.c4
1 files changed, 3 insertions, 1 deletions
diff --git a/sys/kern/kern_fork.c b/sys/kern/kern_fork.c
index a7ba5624565..42a57f07ee0 100644
--- a/sys/kern/kern_fork.c
+++ b/sys/kern/kern_fork.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: kern_fork.c,v 1.95 2008/05/11 23:54:40 tedu Exp $ */
+/* $OpenBSD: kern_fork.c,v 1.96 2008/10/09 06:31:53 guenther Exp $ */
/* $NetBSD: kern_fork.c,v 1.29 1996/02/09 18:59:34 christos Exp $ */
/*
@@ -161,6 +161,7 @@ process_new(struct proc *newproc, struct proc *parent)
pr->ps_mainproc = newproc;
TAILQ_INIT(&pr->ps_threads);
TAILQ_INSERT_TAIL(&pr->ps_threads, newproc, p_thr_link);
+ pr->ps_refcnt = 1;
newproc->p_p = pr;
}
@@ -231,6 +232,7 @@ fork1(struct proc *p1, int exitsig, int flags, void *stack, size_t stacksize,
atomic_setbits_int(&p2->p_flag, P_THREAD);
p2->p_p = p1->p_p;
TAILQ_INSERT_TAIL(&p2->p_p->ps_threads, p2, p_thr_link);
+ p2->p_p->ps_refcnt++;
} else {
process_new(p2, p1);
}