Fix coredump_phnum test with ASLR enabled by default

coredump_phnum intends to generate a core file with many PT_LOAD
segments.  Previously it called mmap() in a loop with alternating
protections, relying on each mapping following the previous, to produce
a core file with many page-sized PT_LOAD segments.  With ASLR on we no
longer have this property of each mmap() following the previous.

Instead, perform a single allocation, and then use mprotect() to set
alternating pages to PROT_READ.

PR:		259970
Reported by:	lwhsu, mw
Reviewed by:	kib
MFC after:	1 week
Sponsored by:	The FreeBSD Foundation
Differential Revision:	https://reviews.freebsd.org/D33070
This commit is contained in:
Ed Maste 2021-11-21 12:17:20 -05:00
parent 77e3db0789
commit 8ec4c5dae3

View File

@ -42,18 +42,21 @@ int
main(int argc __unused, char **argv __unused)
{
void *v;
unsigned i;
size_t i, pages;
for (i = 0; i < UINT16_MAX + 1000; i++) {
pages = UINT16_MAX + 1000;
v = mmap(NULL, pages * PAGE_SIZE, PROT_READ | PROT_WRITE,
MAP_ANON | MAP_PRIVATE, -1, 0);
if (v == NULL)
err(1, "mmap");
for (i = 0; i < pages; i += 2) {
/*
* Alternate protections; otherwise the kernel will just extend
* the adjacent same-protection previous mapping.
* Alternate protections to interleave RW and R PT_LOAD
* segments.
*/
v = mmap(NULL, PAGE_SIZE,
(((i % 2) == 0) ? PROT_READ : 0) | PROT_WRITE,
MAP_ANON | MAP_PRIVATE, -1, 0);
if (v == MAP_FAILED)
err(1, "mmap");
if (mprotect((char *)v + i * PAGE_SIZE, PAGE_SIZE,
PROT_READ) != 0)
err(1, "mprotect");
}
/* Dump core. */