In case the stack size reaches its limit and its growth must be restricted,

ensure that grow_amount is a multiple of the page size.  Otherwise, the
kernel may crash in swap_reserve_by_uid() on HEAD and FreeBSD 8.x, and
produce a core file with a missing stack on FreeBSD 7.x.

Diagnosed and reported by: jilles
Reviewed by:	kib
MFC after:	1 week
This commit is contained in:
Alan Cox 2010-11-07 21:40:34 +00:00
parent 94b78d528f
commit e48262487a

View File

@ -3338,7 +3338,8 @@ vm_map_growstack(struct proc *p, vm_offset_t addr)
if (grow_amount > stack_entry->avail_ssize)
grow_amount = stack_entry->avail_ssize;
if (is_procstack && (ctob(vm->vm_ssize) + grow_amount > stacklim)) {
grow_amount = stacklim - ctob(vm->vm_ssize);
grow_amount = trunc_page((vm_size_t)stacklim) -
ctob(vm->vm_ssize);
}
/* If we would blow our VMEM resource limit, no go */