diff options
author | David Carlier <devnexen@gmail.com> | 2018-08-29 21:04:32 +0100 |
---|---|---|
committer | Nikita Popov <nikita.ppv@gmail.com> | 2018-09-07 12:10:05 +0200 |
commit | f7b573b4e96f3cf421dc92063b11121da2370e46 (patch) | |
tree | d8dfc847e71cd270ed2f19cea2b349883453f31f | |
parent | 6c376996cf824039776707f7d9f2ff7f0abfd0a1 (diff) | |
download | php-git-f7b573b4e96f3cf421dc92063b11121da2370e46.tar.gz |
Support fixed address mmap without replacement
Reapply changes for Zend fixed mapping but only for FreeBSD.
Other BSD might expose some day a similar flag (private
for OpenBSD for the moment for example).
The Linux's part could be brought back but not before 7.4,
at this time, distributions with kernel > 4.17 will be
more widely available.
-rw-r--r-- | Zend/zend_alloc.c | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/Zend/zend_alloc.c b/Zend/zend_alloc.c index 11691d8377..302f9e7281 100644 --- a/Zend/zend_alloc.c +++ b/Zend/zend_alloc.c @@ -423,11 +423,15 @@ static void *zend_mm_mmap_fixed(void *addr, size_t size) #ifdef _WIN32 return VirtualAlloc(addr, size, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE); #else + int flags = MAP_PRIVATE | MAP_ANON; +#if defined(MAP_EXCL) + flags |= MAP_FIXED | MAP_EXCL; +#endif /* MAP_FIXED leads to discarding of the old mapping, so it can't be used. */ - void *ptr = mmap(addr, size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON /*| MAP_POPULATE | MAP_HUGETLB*/, -1, 0); + void *ptr = mmap(addr, size, PROT_READ | PROT_WRITE, flags /*| MAP_POPULATE | MAP_HUGETLB*/, -1, 0); if (ptr == MAP_FAILED) { -#if ZEND_MM_ERROR +#if ZEND_MM_ERROR && !defined(MAP_EXCL) fprintf(stderr, "\nmmap() failed: [%d] %s\n", errno, strerror(errno)); #endif return NULL; |