@@ -205,6 +205,9 @@ static size_t _real_page_size = ZEND_MM_PAGE_SIZE;
205205#define ZEND_MM_POISON_HEAP (_ptr ) ZEND_MM_POISON((_ptr), sizeof(zend_mm_heap));
206206#define ZEND_MM_UNPOISON_HEAP (_ptr ) ZEND_MM_UNPOISON((_ptr), sizeof(zend_mm_heap));
207207
208+ #define ZEND_MM_POISON_DEBUGINFO (_ptr ) ZEND_MM_POISON((_ptr), sizeof(zend_mm_debug_info));
209+ #define ZEND_MM_UNPOISON_DEBUGINFO (_ptr ) ZEND_MM_UNPOISON((_ptr), sizeof(zend_mm_debug_info));
210+
208211#define ZEND_MM_POISON_CHUNK_HDR (_ptr , _heap ) do { \
209212 ZEND_MM_POISON((_ptr), sizeof(zend_mm_chunk)); \
210213 ZEND_MM_UNPOISON_HEAP((_heap)); \
@@ -226,6 +229,8 @@ static size_t _real_page_size = ZEND_MM_PAGE_SIZE;
226229#define ZEND_MM_POISON_CHUNK_HDR (_ptr , _heap )
227230#define ZEND_MM_UNPOISON_CHUNK_HDR (_ptr )
228231#define ZEND_MM_POISON_CHUNK (_ptr , _heap )
232+ #define ZEND_MM_POISON_DEBUGINFO (_ptr )
233+ #define ZEND_MM_UNPOISON_DEBUGINFO (_ptr )
229234
230235#endif
231236typedef uint32_t zend_mm_page_info ; /* 4-byte integer */
@@ -1504,7 +1509,9 @@ static zend_never_inline void *zend_mm_alloc_small_slow(zend_mm_heap *heap, uint
15041509#if ZEND_DEBUG
15051510 do {
15061511 zend_mm_debug_info * dbg = (zend_mm_debug_info * )((char * )p + bin_data_size [bin_num ] - ZEND_MM_ALIGNED_SIZE (sizeof (zend_mm_debug_info )));
1512+ ZEND_MM_UNPOISON_DEBUGINFO (dbg );
15071513 dbg -> size = 0 ;
1514+ ZEND_MM_POISON_DEBUGINFO (dbg );
15081515 } while (0 );
15091516#endif
15101517
@@ -1516,7 +1523,9 @@ static zend_never_inline void *zend_mm_alloc_small_slow(zend_mm_heap *heap, uint
15161523#if ZEND_DEBUG
15171524 do {
15181525 zend_mm_debug_info * dbg = (zend_mm_debug_info * )((char * )p + bin_data_size [bin_num ] - ZEND_MM_ALIGNED_SIZE (sizeof (zend_mm_debug_info )));
1526+ ZEND_MM_UNPOISON_DEBUGINFO (dbg );
15191527 dbg -> size = 0 ;
1528+ ZEND_MM_POISON_DEBUGINFO (dbg );
15201529 } while (0 );
15211530#endif
15221531
@@ -1560,7 +1569,9 @@ static zend_always_inline void zend_mm_free_small(zend_mm_heap *heap, void *ptr,
15601569#if ZEND_DEBUG
15611570 do {
15621571 zend_mm_debug_info * dbg = (zend_mm_debug_info * )((char * )ptr + bin_data_size [bin_num ] - ZEND_MM_ALIGNED_SIZE (sizeof (zend_mm_debug_info )));
1572+ ZEND_MM_UNPOISON_DEBUGINFO (dbg );
15631573 dbg -> size = 0 ;
1574+ ZEND_MM_POISON_DEBUGINFO (dbg );
15641575 } while (0 );
15651576#endif
15661577
@@ -1625,23 +1636,27 @@ static zend_always_inline void *zend_mm_alloc_heap(zend_mm_heap *heap, size_t si
16251636 ptr = zend_mm_alloc_small (heap , ZEND_MM_SMALL_SIZE_TO_BIN (size ) ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC );
16261637#if ZEND_DEBUG
16271638 dbg = zend_mm_get_debug_info (heap , ptr );
1639+ ZEND_MM_UNPOISON_DEBUGINFO (dbg );
16281640 dbg -> size = real_size ;
16291641 dbg -> filename = __zend_filename ;
16301642 dbg -> orig_filename = __zend_orig_filename ;
16311643 dbg -> lineno = __zend_lineno ;
16321644 dbg -> orig_lineno = __zend_orig_lineno ;
1645+ ZEND_MM_POISON_DEBUGINFO (dbg );
16331646#endif
16341647 ZEND_MM_UNPOISON (ptr , size );
16351648 return ptr ;
16361649 } else if (EXPECTED (size <= ZEND_MM_MAX_LARGE_SIZE )) {
16371650 ptr = zend_mm_alloc_large (heap , size ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC );
16381651#if ZEND_DEBUG
1652+ ZEND_MM_UNPOISON_DEBUGINFO (dbg );
16391653 dbg = zend_mm_get_debug_info (heap , ptr );
16401654 dbg -> size = real_size ;
16411655 dbg -> filename = __zend_filename ;
16421656 dbg -> orig_filename = __zend_orig_filename ;
16431657 dbg -> lineno = __zend_lineno ;
16441658 dbg -> orig_lineno = __zend_orig_lineno ;
1659+ ZEND_MM_POISON_DEBUGINFO (dbg );
16451660#endif
16461661 ZEND_MM_UNPOISON (ptr , size );
16471662 return ptr ;
@@ -1692,7 +1707,10 @@ static size_t zend_mm_size(zend_mm_heap *heap, void *ptr ZEND_FILE_LINE_DC ZEND_
16921707 zend_mm_chunk * chunk ;
16931708#if 0 && ZEND_DEBUG
16941709 zend_mm_debug_info * dbg = zend_mm_get_debug_info (heap , ptr );
1695- return dbg -> size ;
1710+ ZEND_MM_UNPOISON_DEBUGINFO (dbg );
1711+ size_t ret = dbg -> size ;
1712+ ZEND_MM_POISON_DEBUGINFO (dbg );
1713+ return ret ;
16961714#else
16971715 int page_num ;
16981716 zend_mm_page_info info ;
@@ -1904,12 +1922,14 @@ static zend_always_inline void *zend_mm_realloc_heap(zend_mm_heap *heap, void *p
19041922 }
19051923
19061924#if ZEND_DEBUG
1925+ ZEND_MM_UNPOISON_DEBUGINFO (dbg );
19071926 dbg = zend_mm_get_debug_info (heap , ret );
19081927 dbg -> size = real_size ;
19091928 dbg -> filename = __zend_filename ;
19101929 dbg -> orig_filename = __zend_orig_filename ;
19111930 dbg -> lineno = __zend_lineno ;
19121931 dbg -> orig_lineno = __zend_orig_lineno ;
1932+ ZEND_MM_POISON_DEBUGINFO (dbg );
19131933#endif
19141934 ZEND_MM_POISON_CHUNK_HDR (chunk , heap );
19151935 return ret ;
@@ -1923,11 +1943,13 @@ static zend_always_inline void *zend_mm_realloc_heap(zend_mm_heap *heap, void *p
19231943 if (new_size == old_size ) {
19241944#if ZEND_DEBUG
19251945 dbg = zend_mm_get_debug_info (heap , ptr );
1946+ ZEND_MM_UNPOISON_DEBUGINFO (dbg );
19261947 dbg -> size = real_size ;
19271948 dbg -> filename = __zend_filename ;
19281949 dbg -> orig_filename = __zend_orig_filename ;
19291950 dbg -> lineno = __zend_lineno ;
19301951 dbg -> orig_lineno = __zend_orig_lineno ;
1952+ ZEND_MM_POISON_DEBUGINFO (dbg );
19311953#endif
19321954 ZEND_MM_POISON_CHUNK_HDR (chunk , heap );
19331955 ZEND_MM_UNPOISON (ptr , size );
@@ -1946,11 +1968,13 @@ static zend_always_inline void *zend_mm_realloc_heap(zend_mm_heap *heap, void *p
19461968 ZEND_MM_POISON (ZEND_MM_PAGE_ADDR (chunk , page_num + new_pages_count ), rest_pages_count * ZEND_MM_PAGE_SIZE );
19471969#if ZEND_DEBUG
19481970 dbg = zend_mm_get_debug_info (heap , ptr );
1971+ ZEND_MM_UNPOISON_DEBUGINFO (dbg );
19491972 dbg -> size = real_size ;
19501973 dbg -> filename = __zend_filename ;
19511974 dbg -> orig_filename = __zend_orig_filename ;
19521975 dbg -> lineno = __zend_lineno ;
19531976 dbg -> orig_lineno = __zend_orig_lineno ;
1977+ ZEND_MM_POISON_DEBUGINFO (dbg );
19541978#endif
19551979 ZEND_MM_POISON_CHUNK_HDR (chunk , heap );
19561980 ZEND_MM_POISON (ptr , old_size );
@@ -1976,11 +2000,13 @@ static zend_always_inline void *zend_mm_realloc_heap(zend_mm_heap *heap, void *p
19762000 chunk -> map [page_num ] = ZEND_MM_LRUN (new_pages_count );
19772001#if ZEND_DEBUG
19782002 dbg = zend_mm_get_debug_info (heap , ptr );
2003+ ZEND_MM_UNPOISON_DEBUGINFO (dbg );
19792004 dbg -> size = real_size ;
19802005 dbg -> filename = __zend_filename ;
19812006 dbg -> orig_filename = __zend_orig_filename ;
19822007 dbg -> lineno = __zend_lineno ;
19832008 dbg -> orig_lineno = __zend_orig_lineno ;
2009+ ZEND_MM_POISON_DEBUGINFO (dbg );
19842010#endif
19852011 ZEND_MM_POISON_CHUNK_HDR (chunk , heap );
19862012 ZEND_MM_UNPOISON (ptr , size );
@@ -2404,6 +2430,7 @@ static zend_long zend_mm_find_leaks_small(zend_mm_chunk *p, uint32_t i, uint32_t
24042430 zend_long count = 0 ;
24052431 int bin_num = ZEND_MM_SRUN_BIN_NUM (p -> map [i ]);
24062432 zend_mm_debug_info * dbg = (zend_mm_debug_info * )((char * )p + ZEND_MM_PAGE_SIZE * i + bin_data_size [bin_num ] * (j + 1 ) - ZEND_MM_ALIGNED_SIZE (sizeof (zend_mm_debug_info )));
2433+ ZEND_MM_UNPOISON_DEBUGINFO (dbg );
24072434
24082435 while (j < bin_elements [bin_num ]) {
24092436 if (dbg -> size != 0 ) {
@@ -2417,7 +2444,9 @@ static zend_long zend_mm_find_leaks_small(zend_mm_chunk *p, uint32_t i, uint32_t
24172444 }
24182445 }
24192446 j ++ ;
2447+ ZEND_MM_POISON_DEBUGINFO (dbg );
24202448 dbg = (zend_mm_debug_info * )((char * )dbg + bin_data_size [bin_num ]);
2449+ ZEND_MM_UNPOISON_DEBUGINFO (dbg );
24212450 }
24222451 if (empty ) {
24232452 zend_mm_bitset_reset_range (p -> free_map , i , bin_pages [bin_num ]);
@@ -2439,10 +2468,13 @@ static zend_long zend_mm_find_leaks(zend_mm_heap *heap, zend_mm_chunk *p, uint32
24392468 } else /* if (p->map[i] & ZEND_MM_IS_LRUN) */ {
24402469 int pages_count = ZEND_MM_LRUN_PAGES (p -> map [i ]);
24412470 zend_mm_debug_info * dbg = (zend_mm_debug_info * )((char * )p + ZEND_MM_PAGE_SIZE * (i + pages_count ) - ZEND_MM_ALIGNED_SIZE (sizeof (zend_mm_debug_info )));
2442-
2471+
2472+ ZEND_MM_UNPOISON_DEBUGINFO (dbg );
24432473 if (dbg -> filename == leak -> filename && dbg -> lineno == leak -> lineno ) {
24442474 count ++ ;
24452475 }
2476+ ZEND_MM_POISON_DEBUGINFO (dbg );
2477+
24462478 zend_mm_bitset_reset_range (p -> free_map , i , pages_count );
24472479 i += pages_count ;
24482480 }
@@ -2520,6 +2552,7 @@ static void zend_mm_check_leaks(zend_mm_heap *heap)
25202552 if (p -> map [i ] & ZEND_MM_IS_SRUN ) {
25212553 int bin_num = ZEND_MM_SRUN_BIN_NUM (p -> map [i ]);
25222554 zend_mm_debug_info * dbg = (zend_mm_debug_info * )((char * )p + ZEND_MM_PAGE_SIZE * i + bin_data_size [bin_num ] - ZEND_MM_ALIGNED_SIZE (sizeof (zend_mm_debug_info )));
2555+ ZEND_MM_UNPOISON_DEBUGINFO (dbg );
25232556
25242557 j = 0 ;
25252558 while (j < bin_elements [bin_num ]) {
@@ -2545,20 +2578,25 @@ static void zend_mm_check_leaks(zend_mm_heap *heap)
25452578 zend_message_dispatcher (ZMSG_MEMORY_LEAK_REPEATED , (void * )(uintptr_t )repeated );
25462579 }
25472580 }
2581+ ZEND_MM_POISON_DEBUGINFO (dbg );
25482582 dbg = (zend_mm_debug_info * )((char * )dbg + bin_data_size [bin_num ]);
2583+ ZEND_MM_UNPOISON_DEBUGINFO (dbg );
25492584 j ++ ;
25502585 }
2586+ ZEND_MM_POISON_DEBUGINFO (dbg );
25512587 i += bin_pages [bin_num ];
25522588 } else /* if (p->map[i] & ZEND_MM_IS_LRUN) */ {
25532589 int pages_count = ZEND_MM_LRUN_PAGES (p -> map [i ]);
25542590 zend_mm_debug_info * dbg = (zend_mm_debug_info * )((char * )p + ZEND_MM_PAGE_SIZE * (i + pages_count ) - ZEND_MM_ALIGNED_SIZE (sizeof (zend_mm_debug_info )));
2591+ ZEND_MM_UNPOISON_DEBUGINFO (dbg );
25552592
25562593 leak .addr = (void * )((char * )p + ZEND_MM_PAGE_SIZE * i );
25572594 leak .size = dbg -> size ;
25582595 leak .filename = dbg -> filename ;
25592596 leak .orig_filename = dbg -> orig_filename ;
25602597 leak .lineno = dbg -> lineno ;
25612598 leak .orig_lineno = dbg -> orig_lineno ;
2599+ ZEND_MM_POISON_DEBUGINFO (dbg );
25622600
25632601 zend_message_dispatcher (ZMSG_LOG_SCRIPT_NAME , NULL );
25642602 zend_message_dispatcher (ZMSG_MEMORY_LEAK_DETECTED , & leak );
0 commit comments