Changeset View
Changeset View
Standalone View
Standalone View
sys/kern/kern_exec.c
Show First 20 Lines • Show All 1,068 Lines • ▼ Show 20 Lines | exec_new_vmspace(struct image_params *imgp, struct sysentvec *sv) | ||||
if (refcount_load(&vmspace->vm_refcnt) == 1 && | if (refcount_load(&vmspace->vm_refcnt) == 1 && | ||||
vm_map_min(map) == sv_minuser && | vm_map_min(map) == sv_minuser && | ||||
vm_map_max(map) == sv->sv_maxuser && | vm_map_max(map) == sv->sv_maxuser && | ||||
cpu_exec_vmspace_reuse(p, map)) { | cpu_exec_vmspace_reuse(p, map)) { | ||||
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), ASLR state | * An exec terminates mlockall(MCL_FUTURE). | ||||
* must be re-evaluated. | * ASLR and W^X states must be re-evaluated. | ||||
emaste: `ASLR and W^X state` maybe? | |||||
*/ | */ | ||||
vm_map_lock(map); | vm_map_lock(map); | ||||
vm_map_modflags(map, 0, MAP_WIREFUTURE | MAP_ASLR | | vm_map_modflags(map, 0, MAP_WIREFUTURE | MAP_ASLR | | ||||
MAP_ASLR_IGNSTART); | MAP_ASLR_IGNSTART | MAP_WXORX); | ||||
markjUnsubmitted Not Done Inline ActionsThe flag is also not preserved by vmspace_fork(). Is it intentional? markj: The flag is also not preserved by vmspace_fork(). Is it intentional? | |||||
vm_map_unlock(map); | 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) | ||||
return (error); | return (error); | ||||
vmspace = p->p_vmspace; | vmspace = p->p_vmspace; | ||||
map = &vmspace->vm_map; | map = &vmspace->vm_map; | ||||
} | } | ||||
▲ Show 20 Lines • Show All 768 Lines • Show Last 20 Lines |
ASLR and W^X state maybe?