@@ -2038,6 +2038,7 @@ static void zend_mm_add_huge_block(zend_mm_heap *heap, void *ptr, size_t size ZE
20382038#endif
20392039{
20402040 zend_mm_huge_list * list = (zend_mm_huge_list * )zend_mm_alloc_heap (heap , sizeof (zend_mm_huge_list ) ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC );
2041+ ZEND_MM_UNPOISON (list , sizeof (zend_mm_huge_list ));
20412042 list -> ptr = ptr ;
20422043 list -> size = size ;
20432044 list -> next = heap -> huge_list ;
@@ -2048,6 +2049,7 @@ static void zend_mm_add_huge_block(zend_mm_heap *heap, void *ptr, size_t size ZE
20482049 list -> dbg .lineno = __zend_lineno ;
20492050 list -> dbg .orig_lineno = __zend_orig_lineno ;
20502051#endif
2052+ ZEND_MM_POISON (list , sizeof (zend_mm_huge_list ));
20512053 heap -> huge_list = list ;
20522054}
20532055
@@ -2056,11 +2058,14 @@ static size_t zend_mm_del_huge_block(zend_mm_heap *heap, void *ptr ZEND_FILE_LIN
20562058 zend_mm_huge_list * prev = NULL ;
20572059 zend_mm_huge_list * list = heap -> huge_list ;
20582060 while (list != NULL ) {
2061+ ZEND_MM_UNPOISON (list , sizeof (zend_mm_huge_list ));
20592062 if (list -> ptr == ptr ) {
20602063 size_t size ;
20612064
20622065 if (prev ) {
2066+ ZEND_MM_UNPOISON (prev , sizeof (zend_mm_huge_list ));
20632067 prev -> next = list -> next ;
2068+ ZEND_MM_POISON (prev , sizeof (zend_mm_huge_list ));
20642069 } else {
20652070 heap -> huge_list = list -> next ;
20662071 }
@@ -2070,6 +2075,7 @@ static size_t zend_mm_del_huge_block(zend_mm_heap *heap, void *ptr ZEND_FILE_LIN
20702075 }
20712076 prev = list ;
20722077 list = list -> next ;
2078+ ZEND_MM_POISON (prev , sizeof (zend_mm_huge_list ));
20732079 }
20742080 ZEND_MM_CHECK (0 , "zend_mm_heap corrupted" );
20752081 return 0 ;
@@ -2079,10 +2085,14 @@ static size_t zend_mm_get_huge_block_size(zend_mm_heap *heap, void *ptr ZEND_FIL
20792085{
20802086 zend_mm_huge_list * list = heap -> huge_list ;
20812087 while (list != NULL ) {
2088+ ZEND_MM_UNPOISON (list , sizeof (zend_mm_huge_list ));
20822089 if (list -> ptr == ptr ) {
2090+ ZEND_MM_POISON (list , sizeof (zend_mm_huge_list ));
20832091 return list -> size ;
20842092 }
2085- list = list -> next ;
2093+ zend_mm_huge_list * next = list -> next ;
2094+ ZEND_MM_POISON (list , sizeof (zend_mm_huge_list ));
2095+ list = next ;
20862096 }
20872097 ZEND_MM_CHECK (0 , "zend_mm_heap corrupted" );
20882098 return 0 ;
@@ -2096,6 +2106,7 @@ static void zend_mm_change_huge_block_size(zend_mm_heap *heap, void *ptr, size_t
20962106{
20972107 zend_mm_huge_list * list = heap -> huge_list ;
20982108 while (list != NULL ) {
2109+ ZEND_MM_UNPOISON (list , sizeof (zend_mm_huge_list ));
20992110 if (list -> ptr == ptr ) {
21002111 list -> size = size ;
21012112#if ZEND_DEBUG
@@ -2105,9 +2116,12 @@ static void zend_mm_change_huge_block_size(zend_mm_heap *heap, void *ptr, size_t
21052116 list -> dbg .lineno = __zend_lineno ;
21062117 list -> dbg .orig_lineno = __zend_orig_lineno ;
21072118#endif
2119+ ZEND_MM_POISON (list , sizeof (zend_mm_huge_list ));
21082120 return ;
21092121 }
2110- list = list -> next ;
2122+ zend_mm_huge_list * next = list -> next ;
2123+ ZEND_MM_POISON (list , sizeof (zend_mm_huge_list ));
2124+ list = next ;
21112125 }
21122126}
21132127
@@ -2529,6 +2543,7 @@ static void zend_mm_check_leaks(zend_mm_heap *heap)
25292543 list = heap -> huge_list ;
25302544 while (list ) {
25312545 zend_mm_huge_list * q = list ;
2546+ ZEND_MM_UNPOISON (list , sizeof (zend_mm_huge_list ));
25322547
25332548 leak .addr = list -> ptr ;
25342549 leak .size = list -> dbg .size ;
@@ -2707,6 +2722,7 @@ ZEND_API void zend_mm_shutdown(zend_mm_heap *heap, bool full, bool silent)
27072722 heap -> huge_list = NULL ;
27082723 while (list ) {
27092724 zend_mm_huge_list * q = list ;
2725+ ZEND_MM_UNPOISON (list , sizeof (zend_mm_huge_list ));
27102726 list = list -> next ;
27112727 zend_mm_chunk_free (heap , q -> ptr , q -> size );
27122728 }
@@ -2923,12 +2939,16 @@ ZEND_API bool is_zend_ptr(const void *ptr)
29232939
29242940 zend_mm_huge_list * block = AG (mm_heap )-> huge_list ;
29252941 while (block ) {
2942+ ZEND_MM_UNPOISON (block , sizeof (zend_mm_huge_list ));
29262943 if (ptr >= block -> ptr
29272944 && ptr < (void * )((char * )block -> ptr + block -> size )) {
2945+ ZEND_MM_POISON (block , sizeof (zend_mm_huge_list ));
29282946 ZEND_MM_POISON_HEAP (AG (mm_heap ));
29292947 return 1 ;
29302948 }
2931- block = block -> next ;
2949+ zend_mm_huge_list * next = block -> next ;
2950+ ZEND_MM_POISON (block , sizeof (zend_mm_huge_list ));
2951+ block = next ;
29322952 }
29332953
29342954 ZEND_MM_POISON_HEAP (AG (mm_heap ));
0 commit comments