Skip to content

Commit 0376092

Browse files
committed
Improvements
1 parent ef9a0d2 commit 0376092

File tree

1 file changed

+18
-10
lines changed

1 file changed

+18
-10
lines changed

Zend/zend_alloc.c

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

34073410
static 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

Comments
 (0)