summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Carlier <devnexen@gmail.com>2018-08-29 21:04:32 +0100
committerNikita Popov <nikita.ppv@gmail.com>2018-09-07 12:10:05 +0200
commitf7b573b4e96f3cf421dc92063b11121da2370e46 (patch)
treed8dfc847e71cd270ed2f19cea2b349883453f31f
parent6c376996cf824039776707f7d9f2ff7f0abfd0a1 (diff)
downloadphp-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.c8
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;