From: David Carlier Date: Mon, 3 Aug 2020 19:49:58 +0000 (+0100) Subject: Fix opcache JIT on NetBSD with PaX X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=362194165a54bc6ab7940db9d70d967990af8e83;p=php Fix opcache JIT on NetBSD with PaX When PaX mprotect active, opcache JIT test fail as it needs the PROT_MPROTECT macro to be able to allow further permission promotion with mprotect. Closes GH-5929. --- diff --git a/ext/opcache/shared_alloc_mmap.c b/ext/opcache/shared_alloc_mmap.c index 8f900c1590..3d2884e948 100644 --- a/ext/opcache/shared_alloc_mmap.c +++ b/ext/opcache/shared_alloc_mmap.c @@ -39,7 +39,11 @@ static int create_segments(size_t requested_size, zend_shared_segment ***shared_segments_p, int *shared_segments_count, char **error_in) { zend_shared_segment *shared_segment; + int flags = PROT_READ | PROT_WRITE; void *p; +#ifdef PROT_MPROTECT + flags |= PROT_MPROTECT(PROT_EXEC); +#endif #ifdef MAP_HUGETLB size_t huge_page_size = 2 * 1024 * 1024; @@ -58,34 +62,34 @@ static int create_segments(size_t requested_size, zend_shared_segment ***shared_ /* to got HUGE PAGES in low 32-bit address we have to reserve address space and then remap it using MAP_HUGETLB */ - p = mmap(NULL, requested_size, PROT_READ | PROT_WRITE, MAP_SHARED|MAP_ANONYMOUS|MAP_32BIT, -1, 0); + p = mmap(NULL, requested_size, flags, MAP_SHARED|MAP_ANONYMOUS|MAP_32BIT, -1, 0); if (p != MAP_FAILED) { munmap(p, requested_size); p = (void*)(ZEND_MM_ALIGNED_SIZE_EX((ptrdiff_t)p, huge_page_size)); - p = mmap(p, requested_size, PROT_READ | PROT_WRITE, MAP_SHARED|MAP_ANONYMOUS|MAP_32BIT|MAP_HUGETLB|MAP_FIXED, -1, 0); + p = mmap(p, requested_size, flags, MAP_SHARED|MAP_ANONYMOUS|MAP_32BIT|MAP_HUGETLB|MAP_FIXED, -1, 0); if (p != MAP_FAILED) { goto success; } else { - p = mmap(NULL, requested_size, PROT_READ | PROT_WRITE, MAP_SHARED|MAP_ANONYMOUS|MAP_32BIT, -1, 0); + p = mmap(NULL, requested_size, flags, MAP_SHARED|MAP_ANONYMOUS|MAP_32BIT, -1, 0); if (p != MAP_FAILED) { goto success; } } } # endif - p = mmap(0, requested_size, PROT_READ | PROT_WRITE, MAP_SHARED|MAP_ANONYMOUS|MAP_HUGETLB, -1, 0); + p = mmap(0, requested_size, flags, MAP_SHARED|MAP_ANONYMOUS|MAP_HUGETLB, -1, 0); if (p != MAP_FAILED) { goto success; } } #elif defined(PREFER_MAP_32BIT) && defined(__x86_64__) && defined(MAP_32BIT) - p = mmap(NULL, requested_size, PROT_READ | PROT_WRITE, MAP_SHARED|MAP_ANONYMOUS|MAP_32BIT, -1, 0); + p = mmap(NULL, requested_size, flags, MAP_SHARED|MAP_ANONYMOUS|MAP_32BIT, -1, 0); if (p != MAP_FAILED) { goto success; } #endif - p = mmap(0, requested_size, PROT_READ | PROT_WRITE, MAP_SHARED|MAP_ANONYMOUS, -1, 0); + p = mmap(0, requested_size, flags, MAP_SHARED|MAP_ANONYMOUS, -1, 0); if (p == MAP_FAILED) { *error_in = "mmap"; return ALLOC_FAILURE;