@@ -146,12 +146,11 @@ static size_t _real_page_size = ZEND_MM_PAGE_SIZE;
146146# define ZEND_MM_ERROR 1 /* report system errors */
147147#endif
148148#ifndef ZEND_MM_HEAP_PROTECTION
149- # define ZEND_MM_HEAP_PROTECTION 1 /* protect heap against corruptions */
150- #endif
151- #ifndef ZEND_MM_HEAP_SPRAYING_PROTECTION
152- # define ZEND_MM_HEAP_SPRAYING_PROTECTION 1 /* protect against remote heap
153- spraying or heap feng chui via
154- environment / user input */
149+ /* Protect heap against:
150+ * - Freelist pointer corruption
151+ * - Heap spraying (heap feng shui) via environment / user input
152+ */
153+ # define ZEND_MM_HEAP_PROTECTION 1
155154#endif
156155
157156#if ZEND_MM_HEAP_PROTECTION
@@ -226,7 +225,7 @@ typedef zend_mm_bitset zend_mm_page_map[ZEND_MM_PAGE_MAP_LEN]; /* 64B */
226225#define ZEND_MM_FREE_SLOT_LEN (ZEND_MM_ZONE_LEN * ZEND_MM_ZONES)
227226#define ZEND_MM_ZONE_DEFAULT 0
228227
229- #if ZEND_MM_HEAP_SPRAYING_PROTECTION
228+ #if ZEND_MM_HEAP_PROTECTION
230229
231230# define ZEND_MM_ZONES 2
232231
@@ -247,7 +246,7 @@ typedef zend_mm_bitset zend_mm_page_map[ZEND_MM_PAGE_MAP_LEN]; /* 64B */
247246# define ZEND_MM_FREE_SLOT_EX (heap , chunk , bin_num ) ((chunk)->zone_free_slot[(bin_num)])
248247# define ZEND_MM_CHUNK_ZONE (heap , chunk ) ((chunk)->zone)
249248
250- #else /* ZEND_MM_HEAP_SPRAYING_PROTECTION */
249+ #else /* ZEND_MM_HEAP_PROTECTION */
251250
252251# define ZEND_MM_ZONES 1
253252
@@ -262,7 +261,7 @@ typedef zend_mm_bitset zend_mm_page_map[ZEND_MM_PAGE_MAP_LEN]; /* 64B */
262261# define ZEND_MM_FREE_SLOT_EX (heap , chunk , bin_num ) ZEND_MM_FREE_SLOT(heap, bin_num)
263262# define ZEND_MM_CHUNK_ZONE (heap , chunk ) (&(heap)->zones[0])
264263
265- #endif /* ZEND_MM_HEAP_SPRAYING_PROTECTION */
264+ #endif /* ZEND_MM_HEAP_PROTECTION */
266265
267266#if UINTPTR_MAX == UINT64_MAX
268267# define BSWAPPTR (u ) ZEND_BYTES_SWAP64(u)
@@ -327,7 +326,7 @@ struct _zend_mm_heap {
327326 size_t peak ; /* peak memory usage */
328327#endif
329328 uintptr_t shadow_key ; /* free slot shadow ptr xor key */
330- #if ZEND_MM_HEAP_SPRAYING_PROTECTION
329+ #if ZEND_MM_HEAP_PROTECTION
331330 zend_mm_free_slot * * zone_free_slot ;
332331#endif
333332 zend_mm_free_slot * free_slot [ZEND_MM_FREE_SLOT_LEN ]; /* free lists for small sizes */
@@ -369,7 +368,7 @@ struct _zend_mm_heap {
369368
370369struct _zend_mm_chunk {
371370 zend_mm_heap * heap ;
372- #if ZEND_MM_HEAP_SPRAYING_PROTECTION
371+ #if ZEND_MM_HEAP_PROTECTION
373372 zend_mm_free_slot * * zone_free_slot ;
374373#endif
375374 zend_mm_chunk * next ;
@@ -379,7 +378,7 @@ struct _zend_mm_chunk {
379378 uint32_t num ;
380379 char reserve [64 - (sizeof (void * ) * 3 + sizeof (uint32_t ) * 3 )];
381380 zend_mm_heap heap_slot ; /* used only in main chunk */
382- #if ZEND_MM_HEAP_SPRAYING_PROTECTION
381+ #if ZEND_MM_HEAP_PROTECTION
383382 zend_mm_zone * zone ;
384383#endif
385384 zend_mm_page_map free_map ; /* 512 bits or 64 bytes */
@@ -950,7 +949,7 @@ static zend_always_inline void zend_mm_chunk_init(zend_mm_heap *heap, zend_mm_zo
950949 chunk -> prev -> next = chunk ;
951950 chunk -> next -> prev = chunk ;
952951 }
953- #if ZEND_MM_HEAP_SPRAYING_PROTECTION
952+ #if ZEND_MM_HEAP_PROTECTION
954953 chunk -> zone_free_slot = ZEND_MM_ZONE_FREE_SLOT (heap , (uintptr_t )(zone - & heap -> zones [0 ]));
955954 chunk -> zone = zone ;
956955#endif
@@ -2116,7 +2115,7 @@ static zend_mm_heap *zend_mm_init(void)
21162115 }
21172116 heap = & chunk -> heap_slot ;
21182117 chunk -> heap = heap ;
2119- #if ZEND_MM_HEAP_SPRAYING_PROTECTION
2118+ #if ZEND_MM_HEAP_PROTECTION
21202119 chunk -> zone_free_slot = ZEND_MM_ZONE_FREE_SLOT (heap , ZEND_MM_ZONE_DEFAULT );
21212120 chunk -> zone = & heap -> zones [0 ];
21222121#endif
@@ -2129,11 +2128,11 @@ static zend_mm_heap *zend_mm_init(void)
21292128 chunk -> map [0 ] = ZEND_MM_LRUN (ZEND_MM_FIRST_PAGE );
21302129 heap -> main_chunk = chunk ;
21312130 heap -> cached_chunks = NULL ;
2132- #if ZEND_MM_HEAP_SPRAYING_PROTECTION
2131+ #if ZEND_MM_HEAP_PROTECTION
21332132 heap -> zone_free_slot = ZEND_MM_ZONE_FREE_SLOT (heap , ZEND_MM_ZONE_DEFAULT );
21342133#endif
21352134 heap -> zones [0 ].chunks = chunk ;
2136- #if ZEND_MM_HEAP_SPRAYING_PROTECTION
2135+ #if ZEND_MM_HEAP_PROTECTION
21372136 heap -> zones [1 ].chunks = NULL ;
21382137#endif
21392138 heap -> chunks_count = 1 ;
@@ -2628,11 +2627,11 @@ ZEND_API void zend_mm_shutdown(zend_mm_heap *heap, bool full, bool silent)
26282627 heap -> last_chunks_delete_boundary = 0 ;
26292628 heap -> last_chunks_delete_count = 0 ;
26302629
2631- #if ZEND_MM_HEAP_SPRAYING_PROTECTION
2630+ #if ZEND_MM_HEAP_PROTECTION
26322631 heap -> zone_free_slot = ZEND_MM_ZONE_FREE_SLOT (heap , ZEND_MM_ZONE_DEFAULT );
26332632#endif
26342633 heap -> zones [0 ].chunks = p ;
2635- #if ZEND_MM_HEAP_SPRAYING_PROTECTION
2634+ #if ZEND_MM_HEAP_PROTECTION
26362635 heap -> zones [1 ].chunks = NULL ;
26372636 ZEND_MM_CHECK (p -> zone == & heap -> zones [0 ], "zend_mm_heap corrupted" );
26382637 ZEND_MM_CHECK (p -> zone_free_slot == ZEND_MM_ZONE_FREE_SLOT (heap , ZEND_MM_ZONE_DEFAULT ), "zend_mm_heap corrupted" );
@@ -2711,7 +2710,7 @@ static size_t alloc_globals_offset;
27112710static zend_alloc_globals alloc_globals ;
27122711#endif
27132712
2714- #if ZEND_MM_HEAP_SPRAYING_PROTECTION
2713+ #if ZEND_MM_HEAP_PROTECTION
27152714# define ZEND_MM_ZONE_INPUT 1
27162715#endif
27172716
@@ -2765,15 +2764,15 @@ ZEND_API bool is_zend_ptr(const void *ptr)
27652764
27662765ZEND_API void zend_mm_input_begin (void )
27672766{
2768- #if ZEND_MM_HEAP_SPRAYING_PROTECTION
2767+ #if ZEND_MM_HEAP_PROTECTION
27692768 AG (use_input_zone )++ ;
27702769 AG (mm_heap )-> zone_free_slot = ZEND_MM_ZONE_FREE_SLOT (AG (mm_heap ), ZEND_MM_ZONE_INPUT );
27712770#endif
27722771}
27732772
27742773ZEND_API void zend_mm_input_end (void )
27752774{
2776- #if ZEND_MM_HEAP_SPRAYING_PROTECTION
2775+ #if ZEND_MM_HEAP_PROTECTION
27772776 AG (use_input_zone )-- ;
27782777 if (!AG (use_input_zone )) {
27792778 AG (mm_heap )-> zone_free_slot = ZEND_MM_ZONE_FREE_SLOT (AG (mm_heap ), ZEND_MM_ZONE_DEFAULT );
@@ -2783,7 +2782,7 @@ ZEND_API void zend_mm_input_end(void)
27832782
27842783ZEND_API bool zend_mm_check_in_input (void )
27852784{
2786- #if ZEND_MM_HEAP_SPRAYING_PROTECTION
2785+ #if ZEND_MM_HEAP_PROTECTION
27872786 return AG (use_input_zone );
27882787#else
27892788 return true;
0 commit comments