summaryrefslogtreecommitdiffstats
path: root/sys/kern/kern_fork.c
diff options
context:
space:
mode:
authorguenther <guenther@openbsd.org>2014-05-04 05:03:26 +0000
committerguenther <guenther@openbsd.org>2014-05-04 05:03:26 +0000
commited557a3682b90c9d79cd694303ca27156c5408c7 (patch)
tree7a2e6557b8aca0bcad585f35e2ae71533ab0ea02 /sys/kern/kern_fork.c
parentWhen kern.nosuidcoredump=3, act like =2 but try to dump cores into (diff)
downloadwireguard-openbsd-ed557a3682b90c9d79cd694303ca27156c5408c7.tar.xz
wireguard-openbsd-ed557a3682b90c9d79cd694303ca27156c5408c7.zip
Add PS_SYSTEM, the process-level mirror of the thread-level P_SYSTEM,
and FORK_SYSTEM as a flag to set them. This eliminates needing to peek into other processes threads in various places. Inspired by NetBSD ok miod@ matthew@
Diffstat (limited to 'sys/kern/kern_fork.c')
-rw-r--r--sys/kern/kern_fork.c8
1 files changed, 6 insertions, 2 deletions
diff --git a/sys/kern/kern_fork.c b/sys/kern/kern_fork.c
index da052e891ff..b2ff5552d91 100644
--- a/sys/kern/kern_fork.c
+++ b/sys/kern/kern_fork.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: kern_fork.c,v 1.164 2014/05/03 22:44:36 guenther Exp $ */
+/* $OpenBSD: kern_fork.c,v 1.165 2014/05/04 05:03:26 guenther Exp $ */
/* $NetBSD: kern_fork.c,v 1.29 1996/02/09 18:59:34 christos Exp $ */
/*
@@ -208,6 +208,8 @@ process_new(struct proc *p, struct process *parent, int flags)
atomic_setbits_int(&pr->ps_flags, PS_TRACED);
if (flags & FORK_NOZOMBIE)
atomic_setbits_int(&pr->ps_flags, PS_NOZOMBIE);
+ if (flags & FORK_SYSTEM)
+ atomic_setbits_int(&pr->ps_flags, PS_SYSTEM);
/* it's sufficiently inited to be globally visible */
LIST_INSERT_HEAD(&allprocess, pr, ps_list);
@@ -236,7 +238,7 @@ fork1(struct proc *curp, int flags, void *stack, pid_t *tidptr,
/* sanity check some flag combinations */
if (flags & FORK_THREAD) {
- if ((flags & FORK_SIGHAND) == 0)
+ if ((flags & FORK_SIGHAND) == 0 || (flags & FORK_SYSTEM) != 0)
return (EINVAL);
}
if (flags & FORK_SIGHAND && (flags & FORK_SHAREVM) == 0)
@@ -331,6 +333,8 @@ fork1(struct proc *curp, int flags, void *stack, pid_t *tidptr,
process_new(p, curpr, flags);
pr = p->p_p;
}
+ if (pr->ps_flags & PS_SYSTEM)
+ atomic_setbits_int(&p->p_flag, P_SYSTEM);
/*
* Duplicate sub-structures as needed.