Skip to content

Commit 4ea8a03

Browse files
committed
Fixes
1 parent 1a259a0 commit 4ea8a03

File tree

1 file changed

+23
-3
lines changed

1 file changed

+23
-3
lines changed

Zend/zend_alloc.c

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)