39
39
static int create_segments (size_t requested_size , zend_shared_segment * * * shared_segments_p , int * shared_segments_count , char * * error_in )
40
40
{
41
41
zend_shared_segment * shared_segment ;
42
+ int flags = PROT_READ | PROT_WRITE ;
42
43
void * p ;
44
+ #ifdef PROT_MPROTECT
45
+ flags |= PROT_MPROTECT (PROT_EXEC );
46
+ #endif
43
47
#ifdef MAP_HUGETLB
44
48
size_t huge_page_size = 2 * 1024 * 1024 ;
45
49
@@ -58,34 +62,34 @@ static int create_segments(size_t requested_size, zend_shared_segment ***shared_
58
62
/* to got HUGE PAGES in low 32-bit address we have to reserve address
59
63
space and then remap it using MAP_HUGETLB */
60
64
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 );
62
66
if (p != MAP_FAILED ) {
63
67
munmap (p , requested_size );
64
68
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 );
66
70
if (p != MAP_FAILED ) {
67
71
goto success ;
68
72
} 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 );
70
74
if (p != MAP_FAILED ) {
71
75
goto success ;
72
76
}
73
77
}
74
78
}
75
79
# 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 );
77
81
if (p != MAP_FAILED ) {
78
82
goto success ;
79
83
}
80
84
}
81
85
#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 );
83
87
if (p != MAP_FAILED ) {
84
88
goto success ;
85
89
}
86
90
#endif
87
91
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 );
89
93
if (p == MAP_FAILED ) {
90
94
* error_in = "mmap" ;
91
95
return ALLOC_FAILURE ;
0 commit comments