@@ -2038,6 +2038,7 @@ static void zend_mm_add_huge_block(zend_mm_heap *heap, void *ptr, size_t size ZE
2038
2038
#endif
2039
2039
{
2040
2040
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 ));
2041
2042
list -> ptr = ptr ;
2042
2043
list -> size = size ;
2043
2044
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
2048
2049
list -> dbg .lineno = __zend_lineno ;
2049
2050
list -> dbg .orig_lineno = __zend_orig_lineno ;
2050
2051
#endif
2052
+ ZEND_MM_POISON (list , sizeof (zend_mm_huge_list ));
2051
2053
heap -> huge_list = list ;
2052
2054
}
2053
2055
@@ -2056,11 +2058,14 @@ static size_t zend_mm_del_huge_block(zend_mm_heap *heap, void *ptr ZEND_FILE_LIN
2056
2058
zend_mm_huge_list * prev = NULL ;
2057
2059
zend_mm_huge_list * list = heap -> huge_list ;
2058
2060
while (list != NULL ) {
2061
+ ZEND_MM_UNPOISON (list , sizeof (zend_mm_huge_list ));
2059
2062
if (list -> ptr == ptr ) {
2060
2063
size_t size ;
2061
2064
2062
2065
if (prev ) {
2066
+ ZEND_MM_UNPOISON (prev , sizeof (zend_mm_huge_list ));
2063
2067
prev -> next = list -> next ;
2068
+ ZEND_MM_POISON (prev , sizeof (zend_mm_huge_list ));
2064
2069
} else {
2065
2070
heap -> huge_list = list -> next ;
2066
2071
}
@@ -2070,6 +2075,7 @@ static size_t zend_mm_del_huge_block(zend_mm_heap *heap, void *ptr ZEND_FILE_LIN
2070
2075
}
2071
2076
prev = list ;
2072
2077
list = list -> next ;
2078
+ ZEND_MM_POISON (prev , sizeof (zend_mm_huge_list ));
2073
2079
}
2074
2080
ZEND_MM_CHECK (0 , "zend_mm_heap corrupted" );
2075
2081
return 0 ;
@@ -2079,10 +2085,14 @@ static size_t zend_mm_get_huge_block_size(zend_mm_heap *heap, void *ptr ZEND_FIL
2079
2085
{
2080
2086
zend_mm_huge_list * list = heap -> huge_list ;
2081
2087
while (list != NULL ) {
2088
+ ZEND_MM_UNPOISON (list , sizeof (zend_mm_huge_list ));
2082
2089
if (list -> ptr == ptr ) {
2090
+ ZEND_MM_POISON (list , sizeof (zend_mm_huge_list ));
2083
2091
return list -> size ;
2084
2092
}
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 ;
2086
2096
}
2087
2097
ZEND_MM_CHECK (0 , "zend_mm_heap corrupted" );
2088
2098
return 0 ;
@@ -2096,6 +2106,7 @@ static void zend_mm_change_huge_block_size(zend_mm_heap *heap, void *ptr, size_t
2096
2106
{
2097
2107
zend_mm_huge_list * list = heap -> huge_list ;
2098
2108
while (list != NULL ) {
2109
+ ZEND_MM_UNPOISON (list , sizeof (zend_mm_huge_list ));
2099
2110
if (list -> ptr == ptr ) {
2100
2111
list -> size = size ;
2101
2112
#if ZEND_DEBUG
@@ -2105,9 +2116,12 @@ static void zend_mm_change_huge_block_size(zend_mm_heap *heap, void *ptr, size_t
2105
2116
list -> dbg .lineno = __zend_lineno ;
2106
2117
list -> dbg .orig_lineno = __zend_orig_lineno ;
2107
2118
#endif
2119
+ ZEND_MM_POISON (list , sizeof (zend_mm_huge_list ));
2108
2120
return ;
2109
2121
}
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 ;
2111
2125
}
2112
2126
}
2113
2127
@@ -2529,6 +2543,7 @@ static void zend_mm_check_leaks(zend_mm_heap *heap)
2529
2543
list = heap -> huge_list ;
2530
2544
while (list ) {
2531
2545
zend_mm_huge_list * q = list ;
2546
+ ZEND_MM_UNPOISON (list , sizeof (zend_mm_huge_list ));
2532
2547
2533
2548
leak .addr = list -> ptr ;
2534
2549
leak .size = list -> dbg .size ;
@@ -2707,6 +2722,7 @@ ZEND_API void zend_mm_shutdown(zend_mm_heap *heap, bool full, bool silent)
2707
2722
heap -> huge_list = NULL ;
2708
2723
while (list ) {
2709
2724
zend_mm_huge_list * q = list ;
2725
+ ZEND_MM_UNPOISON (list , sizeof (zend_mm_huge_list ));
2710
2726
list = list -> next ;
2711
2727
zend_mm_chunk_free (heap , q -> ptr , q -> size );
2712
2728
}
@@ -2923,12 +2939,16 @@ ZEND_API bool is_zend_ptr(const void *ptr)
2923
2939
2924
2940
zend_mm_huge_list * block = AG (mm_heap )-> huge_list ;
2925
2941
while (block ) {
2942
+ ZEND_MM_UNPOISON (block , sizeof (zend_mm_huge_list ));
2926
2943
if (ptr >= block -> ptr
2927
2944
&& ptr < (void * )((char * )block -> ptr + block -> size )) {
2945
+ ZEND_MM_POISON (block , sizeof (zend_mm_huge_list ));
2928
2946
ZEND_MM_POISON_HEAP (AG (mm_heap ));
2929
2947
return 1 ;
2930
2948
}
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 ;
2932
2952
}
2933
2953
2934
2954
ZEND_MM_POISON_HEAP (AG (mm_heap ));
0 commit comments