vm_map_insert sometimes extends an existing vm_map entry, rather than
creating a new entry. vm_map_stack and vm_map_growstack can panic when a new entry isn't created. Fixed vm_map_stack and vm_map_growstack. Also, when extending the stack, always set the protection to VM_PROT_ALL.
This commit is contained in:
parent
4e1b754078
commit
29b45e9e99
@ -61,7 +61,7 @@
|
|||||||
* any improvements or extensions that they make and grant Carnegie the
|
* any improvements or extensions that they make and grant Carnegie the
|
||||||
* rights to redistribute these changes.
|
* rights to redistribute these changes.
|
||||||
*
|
*
|
||||||
* $Id: vm_map.c,v 1.167 1999/06/17 00:27:39 alc Exp $
|
* $Id: vm_map.c,v 1.168 1999/06/17 00:39:26 alc Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -2186,6 +2186,8 @@ vm_map_stack (vm_map_t map, vm_offset_t addrbos, vm_size_t max_ssize,
|
|||||||
|
|
||||||
/* Now set the avail_ssize amount */
|
/* Now set the avail_ssize amount */
|
||||||
if (rv == KERN_SUCCESS){
|
if (rv == KERN_SUCCESS){
|
||||||
|
if (prev_entry != &map->header)
|
||||||
|
vm_map_clip_end(map, prev_entry, addrbos + max_ssize - init_ssize);
|
||||||
new_stack_entry = prev_entry->next;
|
new_stack_entry = prev_entry->next;
|
||||||
if (new_stack_entry->end != addrbos + max_ssize ||
|
if (new_stack_entry->end != addrbos + max_ssize ||
|
||||||
new_stack_entry->start != addrbos + max_ssize - init_ssize)
|
new_stack_entry->start != addrbos + max_ssize - init_ssize)
|
||||||
@ -2311,12 +2313,14 @@ Retry:
|
|||||||
}
|
}
|
||||||
|
|
||||||
rv = vm_map_insert(map, NULL, 0, addr, stack_entry->start,
|
rv = vm_map_insert(map, NULL, 0, addr, stack_entry->start,
|
||||||
stack_entry->protection,
|
VM_PROT_ALL,
|
||||||
stack_entry->max_protection,
|
VM_PROT_ALL,
|
||||||
0);
|
0);
|
||||||
|
|
||||||
/* Adjust the available stack space by the amount we grew. */
|
/* Adjust the available stack space by the amount we grew. */
|
||||||
if (rv == KERN_SUCCESS) {
|
if (rv == KERN_SUCCESS) {
|
||||||
|
if (prev_entry != &map->header)
|
||||||
|
vm_map_clip_end(map, prev_entry, addr);
|
||||||
new_stack_entry = prev_entry->next;
|
new_stack_entry = prev_entry->next;
|
||||||
if (new_stack_entry->end != stack_entry->start ||
|
if (new_stack_entry->end != stack_entry->start ||
|
||||||
new_stack_entry->start != addr)
|
new_stack_entry->start != addr)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user