Skip to content

Commit 3621941

Browse files
devnexennikic
authored andcommitted
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.
1 parent 4644a3e commit 3621941

File tree

1 file changed

+10
-6
lines changed

1 file changed

+10
-6
lines changed

ext/opcache/shared_alloc_mmap.c

+10-6
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,11 @@
3939
static int create_segments(size_t requested_size, zend_shared_segment ***shared_segments_p, int *shared_segments_count, char **error_in)
4040
{
4141
zend_shared_segment *shared_segment;
42+
int flags = PROT_READ | PROT_WRITE;
4243
void *p;
44+
#ifdef PROT_MPROTECT
45+
flags |= PROT_MPROTECT(PROT_EXEC);
46+
#endif
4347
#ifdef MAP_HUGETLB
4448
size_t huge_page_size = 2 * 1024 * 1024;
4549

@@ -58,34 +62,34 @@ static int create_segments(size_t requested_size, zend_shared_segment ***shared_
5862
/* to got HUGE PAGES in low 32-bit address we have to reserve address
5963
space and then remap it using MAP_HUGETLB */
6064

61-
p = mmap(NULL, requested_size, PROT_READ | PROT_WRITE, MAP_SHARED|MAP_ANONYMOUS|MAP_32BIT, -1, 0);
65+
p = mmap(NULL, requested_size, flags, MAP_SHARED|MAP_ANONYMOUS|MAP_32BIT, -1, 0);
6266
if (p != MAP_FAILED) {
6367
munmap(p, requested_size);
6468
p = (void*)(ZEND_MM_ALIGNED_SIZE_EX((ptrdiff_t)p, huge_page_size));
65-
p = mmap(p, requested_size, PROT_READ | PROT_WRITE, MAP_SHARED|MAP_ANONYMOUS|MAP_32BIT|MAP_HUGETLB|MAP_FIXED, -1, 0);
69+
p = mmap(p, requested_size, flags, MAP_SHARED|MAP_ANONYMOUS|MAP_32BIT|MAP_HUGETLB|MAP_FIXED, -1, 0);
6670
if (p != MAP_FAILED) {
6771
goto success;
6872
} else {
69-
p = mmap(NULL, requested_size, PROT_READ | PROT_WRITE, MAP_SHARED|MAP_ANONYMOUS|MAP_32BIT, -1, 0);
73+
p = mmap(NULL, requested_size, flags, MAP_SHARED|MAP_ANONYMOUS|MAP_32BIT, -1, 0);
7074
if (p != MAP_FAILED) {
7175
goto success;
7276
}
7377
}
7478
}
7579
# endif
76-
p = mmap(0, requested_size, PROT_READ | PROT_WRITE, MAP_SHARED|MAP_ANONYMOUS|MAP_HUGETLB, -1, 0);
80+
p = mmap(0, requested_size, flags, MAP_SHARED|MAP_ANONYMOUS|MAP_HUGETLB, -1, 0);
7781
if (p != MAP_FAILED) {
7882
goto success;
7983
}
8084
}
8185
#elif defined(PREFER_MAP_32BIT) && defined(__x86_64__) && defined(MAP_32BIT)
82-
p = mmap(NULL, requested_size, PROT_READ | PROT_WRITE, MAP_SHARED|MAP_ANONYMOUS|MAP_32BIT, -1, 0);
86+
p = mmap(NULL, requested_size, flags, MAP_SHARED|MAP_ANONYMOUS|MAP_32BIT, -1, 0);
8387
if (p != MAP_FAILED) {
8488
goto success;
8589
}
8690
#endif
8791

88-
p = mmap(0, requested_size, PROT_READ | PROT_WRITE, MAP_SHARED|MAP_ANONYMOUS, -1, 0);
92+
p = mmap(0, requested_size, flags, MAP_SHARED|MAP_ANONYMOUS, -1, 0);
8993
if (p == MAP_FAILED) {
9094
*error_in = "mmap";
9195
return ALLOC_FAILURE;

0 commit comments

Comments
 (0)