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:
parent
77e3db0789
commit
8ec4c5dae3
@ -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. */
|
||||
|
Loading…
Reference in New Issue
Block a user