diff options
author | Jason A. Harmening <jah@FreeBSD.org> | 2021-02-15 02:47:22 +0000 |
---|---|---|
committer | Jason A. Harmening <jah@FreeBSD.org> | 2021-02-24 00:04:00 +0000 |
commit | 941747f63cfa127248e6c7246f75c5ac5e142fcc (patch) | |
tree | 973fff0479ec4ba25a8483b9112262101296612f | |
parent | 9bdb559d97268967e893b9f37dc556ae5dcd44fb (diff) | |
download | src-941747f63cfa127248e6c7246f75c5ac5e142fcc.tar.gz src-941747f63cfa127248e6c7246f75c5ac5e142fcc.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
(cherry picked from commit 41032835dc2d489ec7841d7529f74f6389329cd3)
-rw-r--r-- | sys/kern/imgact_elf.c | 5 |
1 files changed, 3 insertions, 2 deletions
diff --git a/sys/kern/imgact_elf.c b/sys/kern/imgact_elf.c index 18b83d6b499a..4c05be66e51f 100644 --- a/sys/kern/imgact_elf.c +++ b/sys/kern/imgact_elf.c @@ -1271,7 +1271,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; } @@ -1281,7 +1282,7 @@ __CONCAT(exec_, __elfN(imgact))(struct image_params *imgp) if (interp != NULL) { VOP_UNLOCK(imgp->vp, 0); 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, |