@@ -433,7 +433,6 @@ static ZEND_COLD ZEND_NORETURN void zend_mm_safe_error(zend_mm_heap *heap,
433433#endif
434434 size_t size )
435435{
436-
437436 heap -> overflow = 1 ;
438437 zend_try {
439438 zend_error_noreturn (E_ERROR ,
@@ -1028,6 +1027,7 @@ static void *zend_mm_alloc_pages(zend_mm_heap *heap, uint32_t pages_count ZEND_F
10281027#else
10291028 zend_mm_safe_error (heap , "Allowed memory size of %zu bytes exhausted (tried to allocate %zu bytes)" , heap -> limit , ZEND_MM_PAGE_SIZE * pages_count );
10301029#endif
1030+ ZEND_ASAN_POISON_MEMORY_REGION (chunk , sizeof (zend_mm_chunk ));
10311031 return NULL ;
10321032 }
10331033 }
@@ -1047,6 +1047,7 @@ static void *zend_mm_alloc_pages(zend_mm_heap *heap, uint32_t pages_count ZEND_F
10471047#else
10481048 zend_mm_safe_error (heap , "Out of memory (allocated %zu bytes) (tried to allocate %zu bytes)" , heap -> real_size , ZEND_MM_PAGE_SIZE * pages_count );
10491049#endif
1050+ ZEND_ASAN_POISON_MEMORY_REGION (chunk , sizeof (zend_mm_chunk ));
10501051 return NULL ;
10511052 }
10521053 }
@@ -1113,7 +1114,7 @@ static zend_always_inline void *zend_mm_alloc_large_ex(zend_mm_heap *heap, size_
11131114#endif
11141115#if ZEND_MM_STAT
11151116 do {
1116- size_t size = heap -> size + pages_count * ZEND_MM_PAGE_SIZE ;
1117+ size_t size = heap -> size + pages_count * ZEND_MM_PAGE_SIZE ;
11171118 size_t peak = MAX (heap -> peak , size );
11181119 heap -> size = size ;
11191120 heap -> peak = peak ;
@@ -1140,7 +1141,7 @@ static zend_always_inline void zend_mm_delete_chunk(zend_mm_heap *heap, zend_mm_
11401141
11411142 ZEND_ASAN_POISON_MEMORY_REGION (chunk -> next , sizeof (zend_mm_chunk ));
11421143 ZEND_ASAN_POISON_MEMORY_REGION (chunk -> prev , sizeof (zend_mm_chunk ));
1143-
1144+
11441145 heap -> chunks_count -- ;
11451146 if (heap -> chunks_count + heap -> cached_chunks_count < heap -> avg_chunks_count + 0.1
11461147 || (heap -> chunks_count == heap -> last_chunks_delete_boundary
@@ -1545,6 +1546,7 @@ static zend_always_inline void *zend_mm_alloc_heap(zend_mm_heap *heap, size_t si
15451546static zend_always_inline void zend_mm_free_heap (zend_mm_heap * heap , void * ptr ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC )
15461547{
15471548 printf ("Freeing %p\n" , ptr );
1549+
15481550 size_t page_offset = ZEND_MM_ALIGNED_OFFSET (ptr , ZEND_MM_CHUNK_SIZE );
15491551
15501552 if (UNEXPECTED (page_offset == 0 )) {
@@ -2131,6 +2133,7 @@ ZEND_API size_t zend_mm_gc(zend_mm_heap *heap)
21312133 bool has_free_pages ;
21322134 size_t collected = 0 ;
21332135
2136+ ZEND_ASAN_UNPOISON_MEMORY_REGION (heap , sizeof (zend_mm_heap ));
21342137#if ZEND_MM_CUSTOM
21352138 if (heap -> use_custom_heap ) {
21362139 size_t (* gc )(void ) = heap -> custom_heap ._gc ;
@@ -2255,6 +2258,7 @@ ZEND_API size_t zend_mm_gc(zend_mm_heap *heap)
22552258 }
22562259 } while (chunk != heap -> main_chunk );
22572260 ZEND_ASAN_POISON_MEMORY_REGION (chunk , sizeof (zend_mm_chunk ));
2261+ ZEND_ASAN_POISON_MEMORY_REGION (heap , sizeof (zend_mm_heap ));
22582262
22592263 printf ("Done running gc\n" );
22602264 return collected * ZEND_MM_PAGE_SIZE ;
@@ -2460,6 +2464,7 @@ ZEND_API void zend_mm_shutdown(zend_mm_heap *heap, bool full, bool silent)
24602464{
24612465 zend_mm_chunk * p ;
24622466 zend_mm_huge_list * list ;
2467+ ZEND_ASAN_UNPOISON_MEMORY_REGION (heap , sizeof (zend_mm_heap ));
24632468
24642469#if ZEND_MM_CUSTOM
24652470 if (heap -> use_custom_heap ) {
@@ -2486,6 +2491,7 @@ ZEND_API void zend_mm_shutdown(zend_mm_heap *heap, bool full, bool silent)
24862491 if (shutdown ) {
24872492 shutdown (full , silent );
24882493 }
2494+ ZEND_ASAN_POISON_MEMORY_REGION (heap , sizeof (zend_mm_heap ));
24892495
24902496 return ;
24912497 }
@@ -2592,6 +2598,7 @@ ZEND_API void zend_mm_shutdown(zend_mm_heap *heap, bool full, bool silent)
25922598 }
25932599 ZEND_ASAN_POISON_MEMORY_REGION (p , sizeof (zend_mm_chunk ));
25942600 }
2601+ ZEND_ASAN_POISON_MEMORY_REGION (heap , sizeof (zend_mm_heap ));
25952602}
25962603
25972604/**************/
@@ -2613,22 +2620,29 @@ ZEND_API void ZEND_FASTCALL _zend_mm_validate(zend_mm_heap *heap)
26132620
26142621ZEND_API void ZEND_FASTCALL zend_mm_validate_fast (zend_mm_heap * heap )
26152622{
2623+ ZEND_ASAN_UNPOISON_MEMORY_REGION (heap , sizeof (zend_mm_heap ));
26162624 for (int i = 0 ; i < 30 ; i ++ ) {
26172625 zend_mm_free_slot * slot = heap -> free_slot [i ];
26182626 if (slot != NULL ) {
26192627 zend_mm_get_next_free_slot (heap , i , slot );
26202628 }
26212629 }
2630+ ZEND_ASAN_POISON_MEMORY_REGION (heap , sizeof (zend_mm_heap ));
26222631}
26232632
26242633ZEND_API void * ZEND_FASTCALL _zend_mm_alloc (zend_mm_heap * heap , size_t size ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC )
26252634{
2626- return zend_mm_alloc_heap (heap , size ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC );
2635+ ZEND_ASAN_UNPOISON_MEMORY_REGION (heap , sizeof (zend_mm_heap ));
2636+ void * ptr = zend_mm_alloc_heap (heap , size ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC );
2637+ ZEND_ASAN_POISON_MEMORY_REGION (heap , sizeof (zend_mm_heap ));
2638+ return ptr ;
26272639}
26282640
26292641ZEND_API void ZEND_FASTCALL _zend_mm_free (zend_mm_heap * heap , void * ptr ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC )
26302642{
2643+ ZEND_ASAN_UNPOISON_MEMORY_REGION (heap , sizeof (zend_mm_heap ));
26312644 zend_mm_free_heap (heap , ptr ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC );
2645+ ZEND_ASAN_POISON_MEMORY_REGION (heap , sizeof (zend_mm_heap ));
26322646}
26332647
26342648void * ZEND_FASTCALL _zend_mm_realloc (zend_mm_heap * heap , void * ptr , size_t size ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC )
@@ -2643,19 +2657,24 @@ void* ZEND_FASTCALL _zend_mm_realloc2(zend_mm_heap *heap, void *ptr, size_t size
26432657
26442658ZEND_API size_t ZEND_FASTCALL _zend_mm_block_size (zend_mm_heap * heap , void * ptr ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC )
26452659{
2660+ ZEND_ASAN_UNPOISON_MEMORY_REGION (heap , sizeof (zend_mm_heap ));
26462661#if ZEND_MM_CUSTOM
26472662 if (UNEXPECTED (heap -> use_custom_heap )) {
26482663 if (heap -> custom_heap ._malloc == tracked_malloc ) {
26492664 zend_ulong h = ((uintptr_t ) ptr ) >> ZEND_MM_ALIGNMENT_LOG2 ;
26502665 zval * size_zv = zend_hash_index_find (heap -> tracked_allocs , h );
26512666 if (size_zv ) {
2667+ ZEND_ASAN_POISON_MEMORY_REGION (heap , sizeof (zend_mm_heap ));
26522668 return Z_LVAL_P (size_zv );
26532669 }
26542670 }
2671+ ZEND_ASAN_POISON_MEMORY_REGION (heap , sizeof (zend_mm_heap ));
26552672 return 0 ;
26562673 }
26572674#endif
2658- return zend_mm_size (heap , ptr ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC );
2675+ size_t ret = zend_mm_size (heap , ptr ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC );
2676+ ZEND_ASAN_POISON_MEMORY_REGION (heap , sizeof (zend_mm_heap ));
2677+ return ret ;
26592678}
26602679
26612680/**********************/
@@ -2834,7 +2853,9 @@ ZEND_API void ZEND_FASTCALL _efree_large(void *ptr, size_t size)
28342853 ZEND_MM_ASSERT (ZEND_MM_LRUN_PAGES (chunk -> map [page_num ]) == pages_count );
28352854 ZEND_ASAN_POISON_MEMORY_REGION (chunk , sizeof (zend_mm_chunk ));
28362855
2856+ ZEND_ASAN_UNPOISON_MEMORY_REGION (AG (mm_heap ), sizeof (zend_mm_heap ));
28372857 zend_mm_free_large (AG (mm_heap ), chunk , page_num , pages_count );
2858+ ZEND_ASAN_POISON_MEMORY_REGION (AG (mm_heap ), sizeof (zend_mm_heap ));
28382859 }
28392860}
28402861
@@ -3219,7 +3240,10 @@ ZEND_API zend_mm_heap *zend_mm_get_heap(void)
32193240ZEND_API bool zend_mm_is_custom_heap (zend_mm_heap * new_heap )
32203241{
32213242#if ZEND_MM_CUSTOM
3222- return AG (mm_heap )-> use_custom_heap ;
3243+ ZEND_ASAN_UNPOISON_MEMORY_REGION (heap , sizeof (zend_mm_heap ));
3244+ bool ret = AG (mm_heap )-> use_custom_heap ;
3245+ ZEND_ASAN_POISON_MEMORY_REGION (heap , sizeof (zend_mm_heap ));
3246+ return ret ;
32233247#else
32243248 return 0 ;
32253249#endif
@@ -3231,7 +3255,9 @@ ZEND_API void zend_mm_set_custom_handlers(zend_mm_heap *heap,
32313255 void * (* _realloc )(void * , size_t ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC ))
32323256{
32333257#if ZEND_MM_CUSTOM
3258+ ZEND_ASAN_UNPOISON_MEMORY_REGION (heap , sizeof (zend_mm_heap ));
32343259 zend_mm_set_custom_handlers_ex (heap , _malloc , _free , _realloc , NULL , NULL );
3260+ ZEND_ASAN_POISON_MEMORY_REGION (heap , sizeof (zend_mm_heap ));
32353261#endif
32363262}
32373263
@@ -3243,6 +3269,7 @@ ZEND_API void zend_mm_set_custom_handlers_ex(zend_mm_heap *heap,
32433269 void (* _shutdown )(bool , bool ))
32443270{
32453271#if ZEND_MM_CUSTOM
3272+ ZEND_ASAN_UNPOISON_MEMORY_REGION (heap , sizeof (zend_mm_heap ));
32463273 zend_mm_heap * _heap = (zend_mm_heap * )heap ;
32473274
32483275 if (!_malloc && !_free && !_realloc ) {
@@ -3255,6 +3282,7 @@ ZEND_API void zend_mm_set_custom_handlers_ex(zend_mm_heap *heap,
32553282 _heap -> custom_heap ._gc = _gc ;
32563283 _heap -> custom_heap ._shutdown = _shutdown ;
32573284 }
3285+ ZEND_ASAN_POISON_MEMORY_REGION (heap , sizeof (zend_mm_heap ));
32583286#endif
32593287}
32603288
@@ -3264,7 +3292,9 @@ ZEND_API void zend_mm_get_custom_handlers(zend_mm_heap *heap,
32643292 void * (* * _realloc )(void * , size_t ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC ))
32653293{
32663294#if ZEND_MM_CUSTOM
3295+ ZEND_ASAN_UNPOISON_MEMORY_REGION (heap , sizeof (zend_mm_heap ));
32673296 zend_mm_get_custom_handlers_ex (heap , _malloc , _free , _realloc , NULL , NULL );
3297+ ZEND_ASAN_POISON_MEMORY_REGION (heap , sizeof (zend_mm_heap ));
32683298#endif
32693299}
32703300
@@ -3276,6 +3306,8 @@ ZEND_API void zend_mm_get_custom_handlers_ex(zend_mm_heap *heap,
32763306 void (* * _shutdown )(bool , bool ))
32773307{
32783308#if ZEND_MM_CUSTOM
3309+ ZEND_ASAN_UNPOISON_MEMORY_REGION (_heap , sizeof (zend_mm_heap ));
3310+
32793311 zend_mm_heap * _heap = (zend_mm_heap * )heap ;
32803312
32813313 if (heap -> use_custom_heap ) {
@@ -3299,6 +3331,7 @@ ZEND_API void zend_mm_get_custom_handlers_ex(zend_mm_heap *heap,
32993331 * _shutdown = NULL ;
33003332 }
33013333 }
3334+ ZEND_ASAN_POISON_MEMORY_REGION (heap , sizeof (zend_mm_heap ));
33023335#else
33033336 * _malloc = NULL ;
33043337 * _free = NULL ;
@@ -3311,7 +3344,10 @@ ZEND_API void zend_mm_get_custom_handlers_ex(zend_mm_heap *heap,
33113344ZEND_API zend_mm_storage * zend_mm_get_storage (zend_mm_heap * heap )
33123345{
33133346#if ZEND_MM_STORAGE
3314- return heap -> storage ;
3347+ ZEND_ASAN_UNPOISON_MEMORY_REGION (heap , sizeof (zend_mm_heap ));
3348+ zend_mm_storage * ret = heap -> storage ;
3349+ ZEND_ASAN_POISON_MEMORY_REGION (heap , sizeof (zend_mm_heap ));
3350+ return ret ;
33153351#else
33163352 return NULL
33173353#endif
0 commit comments