aboutsummaryrefslogtreecommitdiff
path: root/sys
diff options
context:
space:
mode:
authorJason A. Harmening <jah@FreeBSD.org>2021-02-15 02:47:22 +0000
committerJason A. Harmening <jah@FreeBSD.org>2021-02-15 18:38:04 +0000
commit41032835dc2d489ec7841d7529f74f6389329cd3 (patch)
tree98317f56da40a4a4a10cd752086de275f7e83312 /sys
parent85d6747a694a6da2619e9f627d005a0aee87dd34 (diff)
downloadsrc-41032835dc2d489ec7841d7529f74f6389329cd3.tar.gz
src-41032835dc2d489ec7841d7529f74f6389329cd3.zip
Fix divide-by-zero panic when ASLR is enabled and superpages disabled
When locating the anonymous memory region for a vm_map with ASLR enabled, we try to keep the slid base address aligned on a superpage boundary to minimize pagetable fragmentation and maximize the potential usage of superpage mappings. We can't (portably) do this if superpages have been disabled by loader tunable and pagesizes[1] is 0, and it would be less beneficial in that case anyway. PR: 253511 Reported by: johannes@jo-t.de MFC after: 1 week Reviewed by: kib Differential Revision: https://reviews.freebsd.org/D28678
Diffstat (limited to 'sys')
-rw-r--r--sys/kern/imgact_elf.c5
1 files changed, 3 insertions, 2 deletions
diff --git a/sys/kern/imgact_elf.c b/sys/kern/imgact_elf.c
index dae11ab92a6c..245894926ee1 100644
--- a/sys/kern/imgact_elf.c
+++ b/sys/kern/imgact_elf.c
@@ -1287,7 +1287,8 @@ __CONCAT(exec_, __elfN(imgact))(struct image_params *imgp)
maxv1 = maxv / 2 + addr / 2;
MPASS(maxv1 >= addr); /* No overflow */
map->anon_loc = __CONCAT(rnd_, __elfN(base))(map, addr, maxv1,
- MAXPAGESIZES > 1 ? pagesizes[1] : pagesizes[0]);
+ (MAXPAGESIZES > 1 && pagesizes[1] != 0) ?
+ pagesizes[1] : pagesizes[0]);
} else {
map->anon_loc = addr;
}
@@ -1297,7 +1298,7 @@ __CONCAT(exec_, __elfN(imgact))(struct image_params *imgp)
if (interp != NULL) {
VOP_UNLOCK(imgp->vp);
if ((map->flags & MAP_ASLR) != 0) {
- /* Assume that interpeter fits into 1/4 of AS */
+ /* Assume that interpreter fits into 1/4 of AS */
maxv1 = maxv / 2 + addr / 2;
MPASS(maxv1 >= addr); /* No overflow */
addr = __CONCAT(rnd_, __elfN(base))(map, addr,