3939static 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