@@ -1644,7 +1644,6 @@ static zend_always_inline void *zend_mm_alloc_heap(zend_mm_heap *heap, size_t si
16441644 dbg -> orig_lineno = __zend_orig_lineno ;
16451645 ZEND_MM_POISON_DEBUGINFO (dbg );
16461646#endif
1647- ZEND_MM_UNPOISON (ptr , size );
16481647 return ptr ;
16491648 } else if (EXPECTED (size <= ZEND_MM_MAX_LARGE_SIZE )) {
16501649 ptr = zend_mm_alloc_large (heap , size ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC );
@@ -1658,15 +1657,12 @@ static zend_always_inline void *zend_mm_alloc_heap(zend_mm_heap *heap, size_t si
16581657 dbg -> orig_lineno = __zend_orig_lineno ;
16591658 ZEND_MM_POISON_DEBUGINFO (dbg );
16601659#endif
1661- ZEND_MM_UNPOISON (ptr , size );
16621660 return ptr ;
16631661 } else {
16641662#if ZEND_DEBUG
16651663 size = real_size ;
16661664#endif
1667- ptr = zend_mm_alloc_huge (heap , size ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC );
1668- ZEND_MM_UNPOISON (ptr , size );
1669- return ptr ;
1665+ return zend_mm_alloc_huge (heap , size ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC );
16701666 }
16711667}
16721668
@@ -1739,6 +1735,7 @@ static zend_never_inline void *zend_mm_realloc_slow(zend_mm_heap *heap, void *pt
17391735 size_t orig_peak = heap -> peak ;
17401736#endif
17411737 ret = zend_mm_alloc_heap (heap , size ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC );
1738+ ZEND_MM_UNPOISON (ret , size );
17421739 ZEND_MM_UNPOISON (ptr , copy_size );
17431740 memcpy (ret , ptr , copy_size );
17441741 zend_mm_free_heap (heap , ptr ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC );
@@ -2826,6 +2823,9 @@ ZEND_API void* ZEND_FASTCALL _zend_mm_alloc(zend_mm_heap *heap, size_t size ZEND
28262823{
28272824 ZEND_MM_UNPOISON_HEAP (heap );
28282825 void * ptr = zend_mm_alloc_heap (heap , size ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC );
2826+ if (EXPECTED (ptr )) {
2827+ ZEND_MM_UNPOISON (ret , size );
2828+ }
28292829 ZEND_MM_POISON_HEAP (heap );
28302830 return ptr ;
28312831}
@@ -3106,6 +3106,9 @@ ZEND_API void* ZEND_FASTCALL _emalloc(size_t size ZEND_FILE_LINE_DC ZEND_FILE_LI
31063106 }
31073107#endif
31083108 void * ptr = zend_mm_alloc_heap (AG (mm_heap ), size ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC );
3109+ if (EXPECTED (ptr )) {
3110+ ZEND_MM_UNPOISON (ret , size );
3111+ }
31093112 ZEND_MM_POISON_HEAP (AG (mm_heap ));
31103113 return ptr ;
31113114}
@@ -3406,7 +3409,7 @@ static void tracked_free(void *ptr ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC) {
34063409
34073410static void * tracked_realloc (void * ptr , size_t new_size ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC ) {
34083411 zend_mm_heap * heap = AG (mm_heap );
3409- ZEND_MM_POISON_HEAP (heap );
3412+ ZEND_MM_UNPOISON_HEAP (heap );
34103413 zval * old_size_zv = NULL ;
34113414 size_t old_size = 0 ;
34123415 if (ptr ) {
@@ -3428,7 +3431,7 @@ static void *tracked_realloc(void *ptr, size_t new_size ZEND_FILE_LINE_DC ZEND_F
34283431#if ZEND_MM_STAT
34293432 heap -> size += new_size - old_size ;
34303433#endif
3431- ZEND_MM_UNPOISON_HEAP (heap );
3434+ ZEND_MM_POISON_HEAP (heap );
34323435 return ptr ;
34333436}
34343437
@@ -3448,16 +3451,19 @@ static void* poison_malloc(size_t size ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC)
34483451 if (SIZE_MAX - heap -> debug .padding * 2 < size ) {
34493452 zend_mm_panic ("Integer overflow in memory allocation" );
34503453 }
3451- size += heap -> debug .padding * 2 ;
3454+ size_t sizePlusPadding = size + heap -> debug .padding * 2 ;
34523455
3453- void * ptr = zend_mm_alloc_heap (heap , size ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC );
3456+ void * ptr = zend_mm_alloc_heap (heap , sizePlusPadding ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC );
34543457
34553458 if (EXPECTED (ptr )) {
34563459 if (heap -> debug .poison_alloc ) {
3457- memset (ptr , heap -> debug .poison_alloc_value , size );
3460+ ZEND_MM_UNPOISON (ptr , sizePlusPadding );
3461+ memset (ptr , heap -> debug .poison_alloc_value , sizePlusPadding );
3462+ ZEND_MM_POISON (ptr , sizePlusPadding );
34583463 }
34593464
34603465 ptr = (char * )ptr + heap -> debug .padding ;
3466+ ZEND_MM_UNPOISON (ptr , size );
34613467 }
34623468
34633469 return ptr ;
@@ -3479,7 +3485,9 @@ static void poison_free(void *ptr ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC)
34793485 size_t size = zend_mm_size (heap , ptr ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC );
34803486
34813487 if (heap -> debug .poison_free ) {
3488+ ZEND_MM_UNPOISON (ptr , heap -> debug .poison_free_value );
34823489 memset (ptr , heap -> debug .poison_free_value , size );
3490+ ZEND_MM_POISON (ptr , heap -> debug .poison_free_value );
34833491 }
34843492 }
34853493
0 commit comments