Clear the MAP_WIREFUTURE flag on the vm map in exec_new_vmspace() when it
recycles the current vm space. Otherwise, an mlockall(MCL_FUTURE) could still be in effect on the process after an execve(2), which violates the specification for mlockall(2). It's pointless for vm_map_stack() to check the MEMLOCK limit. It will never be asked to wire the stack. Moreover, it doesn't even implement wiring of the stack. Reviewed by: kib, markj MFC after: 1 week Differential Revision: https://reviews.freebsd.org/D11421
This commit is contained in:
parent
2da3e34e0a
commit
8056df6e25
@ -1091,6 +1091,10 @@ exec_new_vmspace(struct image_params *imgp, struct sysentvec *sv)
|
|||||||
shmexit(vmspace);
|
shmexit(vmspace);
|
||||||
pmap_remove_pages(vmspace_pmap(vmspace));
|
pmap_remove_pages(vmspace_pmap(vmspace));
|
||||||
vm_map_remove(map, vm_map_min(map), vm_map_max(map));
|
vm_map_remove(map, vm_map_min(map), vm_map_max(map));
|
||||||
|
/* An exec terminates mlockall(MCL_FUTURE). */
|
||||||
|
vm_map_lock(map);
|
||||||
|
vm_map_modflags(map, 0, MAP_WIREFUTURE);
|
||||||
|
vm_map_unlock(map);
|
||||||
} else {
|
} else {
|
||||||
error = vmspace_exec(p, sv_minuser, sv->sv_maxuser);
|
error = vmspace_exec(p, sv_minuser, sv->sv_maxuser);
|
||||||
if (error)
|
if (error)
|
||||||
|
@ -3557,25 +3557,23 @@ vmspace_fork(struct vmspace *vm1, vm_ooffset_t *fork_charge)
|
|||||||
return (vm2);
|
return (vm2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Create a process's stack for exec_new_vmspace(). This function is never
|
||||||
|
* asked to wire the newly created stack.
|
||||||
|
*/
|
||||||
int
|
int
|
||||||
vm_map_stack(vm_map_t map, vm_offset_t addrbos, vm_size_t max_ssize,
|
vm_map_stack(vm_map_t map, vm_offset_t addrbos, vm_size_t max_ssize,
|
||||||
vm_prot_t prot, vm_prot_t max, int cow)
|
vm_prot_t prot, vm_prot_t max, int cow)
|
||||||
{
|
{
|
||||||
vm_size_t growsize, init_ssize;
|
vm_size_t growsize, init_ssize;
|
||||||
rlim_t lmemlim, vmemlim;
|
rlim_t vmemlim;
|
||||||
int rv;
|
int rv;
|
||||||
|
|
||||||
|
MPASS((map->flags & MAP_WIREFUTURE) == 0);
|
||||||
growsize = sgrowsiz;
|
growsize = sgrowsiz;
|
||||||
init_ssize = (max_ssize < growsize) ? max_ssize : growsize;
|
init_ssize = (max_ssize < growsize) ? max_ssize : growsize;
|
||||||
vm_map_lock(map);
|
vm_map_lock(map);
|
||||||
lmemlim = lim_cur(curthread, RLIMIT_MEMLOCK);
|
|
||||||
vmemlim = lim_cur(curthread, RLIMIT_VMEM);
|
vmemlim = lim_cur(curthread, RLIMIT_VMEM);
|
||||||
if (!old_mlock && map->flags & MAP_WIREFUTURE) {
|
|
||||||
if (ptoa(pmap_wired_count(map->pmap)) + init_ssize > lmemlim) {
|
|
||||||
rv = KERN_NO_SPACE;
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/* If we would blow our VMEM resource limit, no go */
|
/* If we would blow our VMEM resource limit, no go */
|
||||||
if (map->size + init_ssize > vmemlim) {
|
if (map->size + init_ssize > vmemlim) {
|
||||||
rv = KERN_NO_SPACE;
|
rv = KERN_NO_SPACE;
|
||||||
|
Loading…
Reference in New Issue
Block a user