]> granicus.if.org Git - php/commitdiff
Support fixed address mmap without replacement
authorDavid Carlier <devnexen@gmail.com>
Sun, 19 Aug 2018 19:32:28 +0000 (20:32 +0100)
committerNikita Popov <nikita.ppv@gmail.com>
Tue, 21 Aug 2018 06:31:31 +0000 (08:31 +0200)
We did not use MAP_FIXED here, because it may replace an existing
mapping. This commit adds support for MAP_FIXED_NOREPLACE (available
on newer Linux kernels) and MAP_FIXED|MAP_EXCL (available on FreeBSD),
which avoid this issue.

Zend/zend_alloc.c

index 11691d837759d2d1b0812431047951606b8a5cf1..8eec54c6f703fcb37328462e91f669328c10b3a8 100644 (file)
@@ -423,8 +423,13 @@ static void *zend_mm_mmap_fixed(void *addr, size_t size)
 #ifdef _WIN32
        return VirtualAlloc(addr, size, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
 #else
-       /* 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);
+       int flags = MAP_PRIVATE | MAP_ANON;
+#ifdef MAP_FIXED_NOREPLACE
+       flags |= MAP_FIXED_NOREPLACE;
+#elif defined MAP_EXCL
+       flags |= MAP_FIXED | MAP_EXCL;
+#endif
+       void *ptr = mmap(addr, size, PROT_READ | PROT_WRITE, flags /*| MAP_POPULATE | MAP_HUGETLB*/, -1, 0);
 
        if (ptr == MAP_FAILED) {
 #if ZEND_MM_ERROR