diff options
author | 2002-02-22 01:08:42 +0000 | |
---|---|---|
committer | 2002-02-22 01:08:42 +0000 | |
commit | 441ad494bc40701579cf432f2f064660201a32b3 (patch) | |
tree | 1eab3171d9b2a4be8f73dad15ae5c80389def630 /sys/kern/kern_fork.c | |
parent | Ugh. fix numerous bugs. (diff) | |
download | wireguard-openbsd-441ad494bc40701579cf432f2f064660201a32b3.tar.xz wireguard-openbsd-441ad494bc40701579cf432f2f064660201a32b3.zip |
Fix stack sharing in FORK_VMNOSTACK.
Don't assume that the stack is on the top of user address space.
And don't assume that the stack grows down.
Diffstat (limited to 'sys/kern/kern_fork.c')
-rw-r--r-- | sys/kern/kern_fork.c | 18 |
1 files changed, 14 insertions, 4 deletions
diff --git a/sys/kern/kern_fork.c b/sys/kern/kern_fork.c index 5c5e49446e3..9d9c799de5c 100644 --- a/sys/kern/kern_fork.c +++ b/sys/kern/kern_fork.c @@ -1,4 +1,4 @@ -/* $OpenBSD: kern_fork.c,v 1.52 2002/02/16 00:54:49 nordin Exp $ */ +/* $OpenBSD: kern_fork.c,v 1.53 2002/02/22 01:08:42 art Exp $ */ /* $NetBSD: kern_fork.c,v 1.29 1996/02/09 18:59:34 christos Exp $ */ /* @@ -301,10 +301,20 @@ fork1(p1, exitsig, flags, stack, stacksize, func, arg, retval) PHOLD(p1); if (flags & FORK_VMNOSTACK) { - /* share as much address space as possible */ - (void) uvm_map_inherit(&p1->p_vmspace->vm_map, - VM_MIN_ADDRESS, round_page(VM_MAXUSER_ADDRESS - MAXSSIZ), + /* share everything, but ... */ + uvm_map_inherit(&p1->p_vmspace->vm_map, + VM_MIN_ADDRESS, VM_MAXUSER_ADDRESS, MAP_INHERIT_SHARE); + /* ... don't share stack */ +#ifdef MACHINE_STACK_GROWS_UP + uvm_map_inherit(&p1->p_vmspace->vm_map, + USRSTACK, USRSTACK + MAXSSIZ, + MAP_INHERIT_COPY); +#else + uvm_map_inherit(&p1->p_vmspace->vm_map, + USRSTACK - MAXSSIZ, USRSTACK, + MAP_INHERIT_COPY); +#endif } p2->p_addr = (struct user *)uaddr; |