Changeset View
Changeset View
Standalone View
Standalone View
sys/vm/vm_map.c
Show First 20 Lines • Show All 1,667 Lines • ▼ Show 20 Lines | if (try == 1 && en_aslr && !cluster) { | ||||
*/ | */ | ||||
pidx = MAXPAGESIZES > 1 && pagesizes[1] != 0 && | pidx = MAXPAGESIZES > 1 && pagesizes[1] != 0 && | ||||
(find_space == VMFS_SUPER_SPACE || find_space == | (find_space == VMFS_SUPER_SPACE || find_space == | ||||
VMFS_OPTIMAL_SPACE) ? 1 : 0; | VMFS_OPTIMAL_SPACE) ? 1 : 0; | ||||
gap = vm_map_max(map) > MAP_32BIT_MAX_ADDR && | gap = vm_map_max(map) > MAP_32BIT_MAX_ADDR && | ||||
(max_addr == 0 || max_addr > MAP_32BIT_MAX_ADDR) ? | (max_addr == 0 || max_addr > MAP_32BIT_MAX_ADDR) ? | ||||
aslr_pages_rnd_64[pidx] : aslr_pages_rnd_32[pidx]; | aslr_pages_rnd_64[pidx] : aslr_pages_rnd_32[pidx]; | ||||
if (vm_map_findspace(map, curr_min_addr, length + | if (vm_map_findspace(map, curr_min_addr, length + | ||||
gap * pagesizes[pidx], addr) || | gap * pagesizes[pidx], addr)) | ||||
(max_addr != 0 && *addr + length > max_addr)) | |||||
goto again; | goto again; | ||||
/* And randomize the start address. */ | /* And randomize the start address. */ | ||||
*addr += (arc4random() % gap) * pagesizes[pidx]; | *addr += (arc4random() % gap) * pagesizes[pidx]; | ||||
if (max_addr != 0 && *addr + length > max_addr) | |||||
goto again; | |||||
} else if (vm_map_findspace(map, curr_min_addr, length, addr) || | } else if (vm_map_findspace(map, curr_min_addr, length, addr) || | ||||
(max_addr != 0 && *addr + length > max_addr)) { | (max_addr != 0 && *addr + length > max_addr)) { | ||||
if (cluster) { | if (cluster) { | ||||
cluster = false; | cluster = false; | ||||
MPASS(try == 1); | MPASS(try == 1); | ||||
goto again; | goto again; | ||||
} | } | ||||
rv = KERN_NO_SPACE; | rv = KERN_NO_SPACE; | ||||
▲ Show 20 Lines • Show All 2,893 Lines • Show Last 20 Lines |