diff options
author | jhb <jhb@FreeBSD.org> | 2007-07-12 18:01:31 +0000 |
---|---|---|
committer | jhb <jhb@FreeBSD.org> | 2007-07-12 18:01:31 +0000 |
commit | ef42e8706be34f667d7c85b11f408bec22cb3b77 (patch) | |
tree | c78cff16168bf26e653ac32e1c954ba6ed15af12 /sys/kern/kern_exec.c | |
parent | 77c677502e8fa12be84a874b37a001e2ee7f53a4 (diff) | |
download | FreeBSD-src-ef42e8706be34f667d7c85b11f408bec22cb3b77.zip FreeBSD-src-ef42e8706be34f667d7c85b11f408bec22cb3b77.tar.gz |
Fix a couple of issues with the stack limit for 32-bit processes on 64-bit
kernels exposed by the recent fixes to resource limits for 32-bit processes
on 64-bit kernels:
- Let ABIs expose their maximum stack size via a new pointer in sysentvec
and use that in preference to maxssiz during exec() rather than always
using maxssiz for all processses.
- Apply the ABI's limit fixup to the previous stack size when adjusting
RLIMIT_STACK to determine if the existing mapping for the stack needs to
be grown or shrunk (as well as how much it should be grown or shrunk).
Approved by: re (kensmith)
Diffstat (limited to 'sys/kern/kern_exec.c')
-rw-r--r-- | sys/kern/kern_exec.c | 13 |
1 files changed, 9 insertions, 4 deletions
diff --git a/sys/kern/kern_exec.c b/sys/kern/kern_exec.c index 42de9ed..b0c107c 100644 --- a/sys/kern/kern_exec.c +++ b/sys/kern/kern_exec.c @@ -894,6 +894,7 @@ exec_new_vmspace(imgp, sv) struct vmspace *vmspace = p->p_vmspace; vm_offset_t stack_addr; vm_map_t map; + u_long ssiz; imgp->vmspace_destroyed = 1; imgp->sysent = sv; @@ -919,8 +920,12 @@ exec_new_vmspace(imgp, sv) } /* Allocate a new stack */ - stack_addr = sv->sv_usrstack - maxssiz; - error = vm_map_stack(map, stack_addr, (vm_size_t)maxssiz, + if (sv->sv_maxssiz != NULL) + ssiz = *sv->sv_maxssiz; + else + ssiz = maxssiz; + stack_addr = sv->sv_usrstack - ssiz; + error = vm_map_stack(map, stack_addr, (vm_size_t)ssiz, sv->sv_stackprot, VM_PROT_ALL, MAP_STACK_GROWS_DOWN); if (error) return (error); @@ -928,7 +933,7 @@ exec_new_vmspace(imgp, sv) #ifdef __ia64__ /* Allocate a new register stack */ stack_addr = IA64_BACKINGSTORE; - error = vm_map_stack(map, stack_addr, (vm_size_t)maxssiz, + error = vm_map_stack(map, stack_addr, (vm_size_t)ssiz, sv->sv_stackprot, VM_PROT_ALL, MAP_STACK_GROWS_UP); if (error) return (error); @@ -939,7 +944,7 @@ exec_new_vmspace(imgp, sv) * process stack so we can check the stack rlimit. */ vmspace->vm_ssize = sgrowsiz >> PAGE_SHIFT; - vmspace->vm_maxsaddr = (char *)sv->sv_usrstack - maxssiz; + vmspace->vm_maxsaddr = (char *)sv->sv_usrstack - ssiz; return (0); } |