]> granicus.if.org Git - php/commitdiff
Support fixed address mmap without replacement
authorDavid Carlier <devnexen@gmail.com>
Wed, 29 Aug 2018 20:04:32 +0000 (21:04 +0100)
committerNikita Popov <nikita.ppv@gmail.com>
Fri, 7 Sep 2018 10:10:05 +0000 (12:10 +0200)
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.

Zend/zend_alloc.c

index 11691d837759d2d1b0812431047951606b8a5cf1..302f9e728154e6bee645bad1f5b4eb2829f16287 100644 (file)
@@ -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;