summaryrefslogtreecommitdiffstats
path: root/sys/kern/kern_exec.c
diff options
context:
space:
mode:
authorjhb <jhb@FreeBSD.org>2007-07-12 18:01:31 +0000
committerjhb <jhb@FreeBSD.org>2007-07-12 18:01:31 +0000
commitef42e8706be34f667d7c85b11f408bec22cb3b77 (patch)
treec78cff16168bf26e653ac32e1c954ba6ed15af12 /sys/kern/kern_exec.c
parent77c677502e8fa12be84a874b37a001e2ee7f53a4 (diff)
downloadFreeBSD-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.c13
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);
}
OpenPOWER on IntegriCloud