Skip to content

Commit d7f9b16

Browse files
committed
More poisoning
1 parent c27fb82 commit d7f9b16

File tree

1 file changed

+83
-14
lines changed

1 file changed

+83
-14
lines changed

Zend/zend_alloc.c

Lines changed: 83 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2697,23 +2697,29 @@ static zend_alloc_globals alloc_globals;
26972697
ZEND_API bool is_zend_mm(void)
26982698
{
26992699
#if ZEND_MM_CUSTOM
2700-
return !AG(mm_heap)->use_custom_heap;
2700+
ZEND_ASAN_UNPOISON_MEMORY_REGION(AG(mm_heap), sizeof(zend_mm_heap));
2701+
bool ret = !AG(mm_heap)->use_custom_heap;
2702+
ZEND_ASAN_POISON_MEMORY_REGION(AG(mm_heap), sizeof(zend_mm_heap));
2703+
return ret;
27012704
#else
27022705
return 1;
27032706
#endif
27042707
}
27052708

27062709
ZEND_API bool is_zend_ptr(const void *ptr)
27072710
{
2711+
ZEND_ASAN_POISON_MEMORY_REGION(AG(mm_heap), sizeof(zend_mm_heap));
27082712
#if ZEND_MM_CUSTOM
27092713
if (AG(mm_heap)->use_custom_heap) {
27102714
if (AG(mm_heap)->custom_heap._malloc == tracked_malloc) {
27112715
zend_ulong h = ((uintptr_t) ptr) >> ZEND_MM_ALIGNMENT_LOG2;
27122716
zval *size_zv = zend_hash_index_find(AG(mm_heap)->tracked_allocs, h);
27132717
if (size_zv) {
2718+
ZEND_ASAN_POISON_MEMORY_REGION(AG(mm_heap), sizeof(zend_mm_heap));
27142719
return 1;
27152720
}
27162721
}
2722+
ZEND_ASAN_POISON_MEMORY_REGION(AG(mm_heap), sizeof(zend_mm_heap));
27172723
return 0;
27182724
}
27192725
#endif
@@ -2727,6 +2733,7 @@ ZEND_API bool is_zend_ptr(const void *ptr)
27272733
if (ptr >= (void*)chunk
27282734
&& ptr < (void*)((char*)chunk + ZEND_MM_CHUNK_SIZE)) {
27292735
ZEND_ASAN_POISON_MEMORY_REGION(chunk, sizeof(zend_mm_chunk));
2736+
ZEND_ASAN_POISON_MEMORY_REGION(AG(mm_heap), sizeof(zend_mm_heap));
27302737
return 1;
27312738
}
27322739
next = chunk->next;
@@ -2741,11 +2748,13 @@ ZEND_API bool is_zend_ptr(const void *ptr)
27412748
while (block) {
27422749
if (ptr >= block->ptr
27432750
&& ptr < (void*)((char*)block->ptr + block->size)) {
2751+
ZEND_ASAN_POISON_MEMORY_REGION(AG(mm_heap), sizeof(zend_mm_heap));
27442752
return 1;
27452753
}
27462754
block = block->next;
27472755
}
27482756

2757+
ZEND_ASAN_POISON_MEMORY_REGION(AG(mm_heap), sizeof(zend_mm_heap));
27492758
return 0;
27502759
}
27512760

@@ -2775,7 +2784,9 @@ ZEND_API bool is_zend_ptr(const void *ptr)
27752784
if (_size < _min_size) { \
27762785
return _emalloc_ ## _min_size(); \
27772786
} \
2787+
ZEND_ASAN_UNPOISON_MEMORY_REGION(AG(mm_heap), sizeof(zend_mm_heap)); \
27782788
void *ptr = zend_mm_alloc_small(AG(mm_heap), _num ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC); \
2789+
ZEND_ASAN_POISON_MEMORY_REGION(AG(mm_heap), sizeof(zend_mm_heap)); \
27792790
ZEND_ASAN_UNPOISON_MEMORY_REGION(ptr, _size); \
27802791
return ptr; \
27812792
}
@@ -2785,15 +2796,19 @@ ZEND_MM_BINS_INFO(_ZEND_BIN_ALLOCATOR, ZEND_MM_MIN_USEABLE_BIN_SIZE, y)
27852796
ZEND_API void* ZEND_FASTCALL _emalloc_large(size_t size ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC)
27862797
{
27872798
ZEND_MM_CUSTOM_ALLOCATOR(size);
2799+
ZEND_ASAN_UNPOISON_MEMORY_REGION(AG(mm_heap), sizeof(zend_mm_heap));
27882800
void *ptr = zend_mm_alloc_large_ex(AG(mm_heap), size ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC);
2801+
ZEND_ASAN_POISON_MEMORY_REGION(AG(mm_heap), sizeof(zend_mm_heap));
27892802
ZEND_ASAN_UNPOISON_MEMORY_REGION(ptr, size);
27902803
return ptr;
27912804
}
27922805

27932806
ZEND_API void* ZEND_FASTCALL _emalloc_huge(size_t size)
27942807
{
27952808
ZEND_MM_CUSTOM_ALLOCATOR(size);
2809+
ZEND_ASAN_UNPOISON_MEMORY_REGION(AG(mm_heap), sizeof(zend_mm_heap));
27962810
void *ptr = zend_mm_alloc_huge(AG(mm_heap), size);
2811+
ZEND_ASAN_POISON_MEMORY_REGION(AG(mm_heap), sizeof(zend_mm_heap));
27972812
ZEND_ASAN_UNPOISON_MEMORY_REGION(ptr, size);
27982813
return ptr;
27992814
}
@@ -2815,7 +2830,9 @@ ZEND_API void* ZEND_FASTCALL _emalloc_huge(size_t size)
28152830
ZEND_MM_ASSERT(chunk->map[page_num] & ZEND_MM_IS_SRUN); \
28162831
ZEND_MM_ASSERT(ZEND_MM_SRUN_BIN_NUM(chunk->map[page_num]) == _num); \
28172832
ZEND_ASAN_POISON_MEMORY_REGION(chunk, sizeof(zend_mm_chunk)); \
2833+
ZEND_ASAN_UNPOISON_MEMORY_REGION(AG(mm_heap), sizeof(zend_mm_heap)); \
28182834
zend_mm_free_small(AG(mm_heap), ptr, _num); \
2835+
ZEND_ASAN_POISON_MEMORY_REGION(AG(mm_heap), sizeof(zend_mm_heap)); \
28192836
} \
28202837
}
28212838
#else
@@ -2831,7 +2848,9 @@ ZEND_API void* ZEND_FASTCALL _emalloc_huge(size_t size)
28312848
ZEND_ASAN_UNPOISON_MEMORY_REGION(chunk, sizeof(zend_mm_chunk)); \
28322849
ZEND_MM_CHECK(chunk->heap == AG(mm_heap), "zend_mm_heap corrupted"); \
28332850
ZEND_ASAN_POISON_MEMORY_REGION(chunk, sizeof(zend_mm_chunk)); \
2851+
ZEND_ASAN_UNPOISON_MEMORY_REGION(AG(mm_heap), sizeof(zend_mm_heap)); \
28342852
zend_mm_free_small(AG(mm_heap), ptr, _num); \
2853+
ZEND_ASAN_POISON_MEMORY_REGION(AG(mm_heap), sizeof(zend_mm_heap)); \
28352854
} \
28362855
}
28372856
#endif
@@ -2847,6 +2866,8 @@ ZEND_API void ZEND_FASTCALL _efree_large(void *ptr, size_t size)
28472866
int page_num = page_offset / ZEND_MM_PAGE_SIZE;
28482867
uint32_t pages_count = ZEND_MM_ALIGNED_SIZE_EX(size, ZEND_MM_PAGE_SIZE) / ZEND_MM_PAGE_SIZE;
28492868

2869+
ZEND_ASAN_UNPOISON_MEMORY_REGION(AG(mm_heap), sizeof(zend_mm_heap));
2870+
28502871
ZEND_ASAN_UNPOISON_MEMORY_REGION(chunk, sizeof(zend_mm_chunk));
28512872
ZEND_MM_CHECK(chunk->heap == AG(mm_heap) && ZEND_MM_ALIGNED_OFFSET(page_offset, ZEND_MM_PAGE_SIZE) == 0, "zend_mm_heap corrupted");
28522873
ZEND_MM_ASSERT(chunk->map[page_num] & ZEND_MM_IS_LRUN);
@@ -2856,65 +2877,88 @@ ZEND_API void ZEND_FASTCALL _efree_large(void *ptr, size_t size)
28562877
ZEND_ASAN_UNPOISON_MEMORY_REGION(AG(mm_heap), sizeof(zend_mm_heap));
28572878
zend_mm_free_large(AG(mm_heap), chunk, page_num, pages_count);
28582879
ZEND_ASAN_POISON_MEMORY_REGION(AG(mm_heap), sizeof(zend_mm_heap));
2880+
2881+
ZEND_ASAN_POISON_MEMORY_REGION(AG(mm_heap), sizeof(zend_mm_heap));
28592882
}
28602883
}
28612884

28622885
ZEND_API void ZEND_FASTCALL _efree_huge(void *ptr, size_t size)
28632886
{
28642887

28652888
ZEND_MM_CUSTOM_DEALLOCATOR(ptr);
2889+
ZEND_ASAN_UNPOISON_MEMORY_REGION(AG(mm_heap), sizeof(zend_mm_heap));
28662890
zend_mm_free_huge(AG(mm_heap), ptr);
2891+
ZEND_ASAN_POISON_MEMORY_REGION(AG(mm_heap), sizeof(zend_mm_heap));
28672892
}
28682893
#endif
28692894

28702895
ZEND_API void* ZEND_FASTCALL _emalloc(size_t size ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC)
28712896
{
28722897
#if ZEND_MM_CUSTOM
2898+
ZEND_ASAN_UNPOISON_MEMORY_REGION(AG(mm_heap), sizeof(zend_mm_heap));
28732899
if (UNEXPECTED(AG(mm_heap)->use_custom_heap)) {
2874-
return AG(mm_heap)->custom_heap._malloc(size ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC); \
2900+
void *ptr = AG(mm_heap)->custom_heap._malloc(size ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC); \
2901+
ZEND_ASAN_POISON_MEMORY_REGION(AG(mm_heap), sizeof(zend_mm_heap));
2902+
return ptr;
28752903
}
28762904
#endif
28772905
void *ptr = zend_mm_alloc_heap(AG(mm_heap), size ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC);
28782906
printf("Alloced %p\n", ptr);
2907+
ZEND_ASAN_POISON_MEMORY_REGION(AG(mm_heap), sizeof(zend_mm_heap));
28792908
return ptr;
28802909
}
28812910

28822911
ZEND_API void ZEND_FASTCALL _efree(void *ptr ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC)
28832912
{
28842913
printf("Freed %p\n", ptr);
2885-
2914+
ZEND_ASAN_UNPOISON_MEMORY_REGION(AG(mm_heap), sizeof(zend_mm_heap));
28862915
#if ZEND_MM_CUSTOM
28872916
if (UNEXPECTED(AG(mm_heap)->use_custom_heap)) {
28882917
AG(mm_heap)->custom_heap._free(ptr ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC);
2918+
ZEND_ASAN_POISON_MEMORY_REGION(AG(mm_heap), sizeof(zend_mm_heap));
28892919
return;
28902920
}
28912921
#endif
28922922
zend_mm_free_heap(AG(mm_heap), ptr ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC);
2923+
ZEND_ASAN_POISON_MEMORY_REGION(AG(mm_heap), sizeof(zend_mm_heap));
28932924
}
28942925

28952926
ZEND_API void* ZEND_FASTCALL _erealloc(void *ptr, size_t size ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC)
28962927
{
28972928
#if ZEND_MM_CUSTOM
2929+
ZEND_ASAN_UNPOISON_MEMORY_REGION(AG(mm_heap), sizeof(zend_mm_heap));
28982930
if (UNEXPECTED(AG(mm_heap)->use_custom_heap)) {
2899-
return AG(mm_heap)->custom_heap._realloc(ptr, size ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC);
2931+
ptr = AG(mm_heap)->custom_heap._realloc(ptr, size ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC);
2932+
ZEND_ASAN_POISON_MEMORY_REGION(AG(mm_heap), sizeof(zend_mm_heap));
2933+
return ptr;
29002934
}
29012935
#endif
2902-
return zend_mm_realloc_heap(AG(mm_heap), ptr, size, 0, size ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC);
2936+
ptr = zend_mm_realloc_heap(AG(mm_heap), ptr, size, 0, size ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC);
2937+
ZEND_ASAN_POISON_MEMORY_REGION(AG(mm_heap), sizeof(zend_mm_heap));
2938+
return ptr;
29032939
}
29042940

29052941
ZEND_API void* ZEND_FASTCALL _erealloc2(void *ptr, size_t size, size_t copy_size ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC)
29062942
{
29072943
#if ZEND_MM_CUSTOM
2944+
ZEND_ASAN_UNPOISON_MEMORY_REGION(AG(mm_heap), sizeof(zend_mm_heap));
29082945
if (UNEXPECTED(AG(mm_heap)->use_custom_heap)) {
2909-
return AG(mm_heap)->custom_heap._realloc(ptr, size ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC);
2946+
ptr = AG(mm_heap)->custom_heap._realloc(ptr, size ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC);
2947+
ZEND_ASAN_UNPOISON_MEMORY_REGION(AG(mm_heap), sizeof(zend_mm_heap));
2948+
return ptr;
29102949
}
29112950
#endif
2912-
return zend_mm_realloc_heap(AG(mm_heap), ptr, size, 1, copy_size ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC);
2951+
ptr = zend_mm_realloc_heap(AG(mm_heap), ptr, size, 1, copy_size ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC);
2952+
ZEND_ASAN_UNPOISON_MEMORY_REGION(AG(mm_heap), sizeof(zend_mm_heap));
2953+
return ptr;
29132954
}
29142955

29152956
ZEND_API size_t ZEND_FASTCALL _zend_mem_block_size(void *ptr ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC)
29162957
{
2917-
return _zend_mm_block_size(AG(mm_heap), ptr ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC);
2958+
ZEND_ASAN_UNPOISON_MEMORY_REGION(AG(mm_heap), sizeof(zend_mm_heap));
2959+
size_t ret = _zend_mm_block_size(AG(mm_heap), ptr ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC);
2960+
ZEND_ASAN_POISON_MEMORY_REGION(AG(mm_heap), sizeof(zend_mm_heap));
2961+
return ret;
29182962
}
29192963

29202964
ZEND_API void* ZEND_FASTCALL _safe_emalloc(size_t nmemb, size_t size, size_t offset ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC)
@@ -2997,13 +3041,15 @@ ZEND_API char* ZEND_FASTCALL zend_strndup(const char *s, size_t length)
29973041
ZEND_API zend_result zend_set_memory_limit(size_t memory_limit)
29983042
{
29993043
#if ZEND_MM_LIMIT
3044+
ZEND_ASAN_UNPOISON_MEMORY_REGION(AG(mm_heap), sizeof(zend_mm_heap));
30003045
zend_mm_heap *heap = AG(mm_heap);
30013046

30023047
if (UNEXPECTED(memory_limit < heap->real_size)) {
30033048
if (memory_limit >= heap->real_size - heap->cached_chunks_count * ZEND_MM_CHUNK_SIZE) {
30043049
/* free some cached chunks to fit into new memory limit */
30053050
do {
30063051
zend_mm_chunk *p = heap->cached_chunks;
3052+
ZEND_ASAN_UNPOISON_MEMORY_REGION(p, sizeof(zend_mm_chunk));
30073053
heap->cached_chunks = p->next;
30083054
zend_mm_chunk_free(heap, p, ZEND_MM_CHUNK_SIZE);
30093055
heap->cached_chunks_count--;
@@ -3014,14 +3060,18 @@ ZEND_API zend_result zend_set_memory_limit(size_t memory_limit)
30143060
return FAILURE;
30153061
}
30163062
AG(mm_heap)->limit = memory_limit;
3063+
ZEND_ASAN_POISON_MEMORY_REGION(AG(mm_heap), sizeof(zend_mm_heap));
30173064
#endif
30183065
return SUCCESS;
30193066
}
30203067

30213068
ZEND_API bool zend_alloc_in_memory_limit_error_reporting(void)
30223069
{
30233070
#if ZEND_MM_LIMIT
3024-
return AG(mm_heap)->overflow;
3071+
ZEND_ASAN_UNPOISON_MEMORY_REGION(AG(mm_heap), sizeof(zend_mm_heap));
3072+
bool ret = AG(mm_heap)->overflow;
3073+
ZEND_ASAN_POISON_MEMORY_REGION(AG(mm_heap), sizeof(zend_mm_heap));
3074+
return ret;
30253075
#else
30263076
return false;
30273077
#endif
@@ -3030,11 +3080,17 @@ ZEND_API bool zend_alloc_in_memory_limit_error_reporting(void)
30303080
ZEND_API size_t zend_memory_usage(bool real_usage)
30313081
{
30323082
#if ZEND_MM_STAT
3083+
size_t ret;
30333084
if (real_usage) {
3034-
return AG(mm_heap)->real_size;
3085+
ZEND_ASAN_UNPOISON_MEMORY_REGION(AG(mm_heap), sizeof(zend_mm_heap));
3086+
ret = AG(mm_heap)->real_size;
3087+
ZEND_ASAN_POISON_MEMORY_REGION(AG(mm_heap), sizeof(zend_mm_heap));
3088+
return ret;
30353089
} else {
3036-
size_t usage = AG(mm_heap)->size;
3037-
return usage;
3090+
ZEND_ASAN_UNPOISON_MEMORY_REGION(AG(mm_heap), sizeof(zend_mm_heap));
3091+
ret = AG(mm_heap)->size;
3092+
ZEND_ASAN_POISON_MEMORY_REGION(AG(mm_heap), sizeof(zend_mm_heap));
3093+
return ret;
30383094
}
30393095
#endif
30403096
return 0;
@@ -3043,10 +3099,15 @@ ZEND_API size_t zend_memory_usage(bool real_usage)
30433099
ZEND_API size_t zend_memory_peak_usage(bool real_usage)
30443100
{
30453101
#if ZEND_MM_STAT
3102+
size_t ret;
30463103
if (real_usage) {
3047-
return AG(mm_heap)->real_peak;
3104+
ZEND_ASAN_UNPOISON_MEMORY_REGION(AG(mm_heap), sizeof(zend_mm_heap));
3105+
ret = AG(mm_heap)->real_peak;
3106+
ZEND_ASAN_POISON_MEMORY_REGION(AG(mm_heap), sizeof(zend_mm_heap));
30483107
} else {
3049-
return AG(mm_heap)->peak;
3108+
ZEND_ASAN_UNPOISON_MEMORY_REGION(AG(mm_heap), sizeof(zend_mm_heap));
3109+
ret = AG(mm_heap)->peak;
3110+
ZEND_ASAN_POISON_MEMORY_REGION(AG(mm_heap), sizeof(zend_mm_heap));
30503111
}
30513112
#endif
30523113
return 0;
@@ -3055,8 +3116,10 @@ ZEND_API size_t zend_memory_peak_usage(bool real_usage)
30553116
ZEND_API void zend_memory_reset_peak_usage(void)
30563117
{
30573118
#if ZEND_MM_STAT
3119+
ZEND_ASAN_UNPOISON_MEMORY_REGION(AG(mm_heap), sizeof(zend_mm_heap));
30583120
AG(mm_heap)->real_peak = AG(mm_heap)->real_size;
30593121
AG(mm_heap)->peak = AG(mm_heap)->size;
3122+
ZEND_ASAN_POISON_MEMORY_REGION(AG(mm_heap), sizeof(zend_mm_heap));
30603123
#endif
30613124
}
30623125

@@ -3104,6 +3167,7 @@ static zend_always_inline void tracked_check_limit(zend_mm_heap *heap, size_t ad
31043167
static void *tracked_malloc(size_t size ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC)
31053168
{
31063169
zend_mm_heap *heap = AG(mm_heap);
3170+
ZEND_ASAN_UNPOISON_MEMORY_REGION(heap, sizeof(zend_mm_heap));
31073171
tracked_check_limit(heap, size);
31083172

31093173
void *ptr = malloc(size);
@@ -3113,6 +3177,7 @@ static void *tracked_malloc(size_t size ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC
31133177

31143178
tracked_add(heap, ptr, size);
31153179
heap->size += size;
3180+
ZEND_ASAN_POISON_MEMORY_REGION(heap, sizeof(zend_mm_heap));
31163181
return ptr;
31173182
}
31183183

@@ -3122,14 +3187,17 @@ static void tracked_free(void *ptr ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC) {
31223187
}
31233188

31243189
zend_mm_heap *heap = AG(mm_heap);
3190+
ZEND_ASAN_UNPOISON_MEMORY_REGION(heap, sizeof(zend_mm_heap));
31253191
zval *size_zv = tracked_get_size_zv(heap, ptr);
31263192
heap->size -= Z_LVAL_P(size_zv);
31273193
zend_hash_del_bucket(heap->tracked_allocs, (Bucket *) size_zv);
3194+
ZEND_ASAN_POISON_MEMORY_REGION(heap, sizeof(zend_mm_heap));
31283195
free(ptr);
31293196
}
31303197

31313198
static void *tracked_realloc(void *ptr, size_t new_size ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC) {
31323199
zend_mm_heap *heap = AG(mm_heap);
3200+
ZEND_ASAN_POISON_MEMORY_REGION(heap, sizeof(zend_mm_heap));
31333201
zval *old_size_zv = NULL;
31343202
size_t old_size = 0;
31353203
if (ptr) {
@@ -3149,6 +3217,7 @@ static void *tracked_realloc(void *ptr, size_t new_size ZEND_FILE_LINE_DC ZEND_F
31493217
ptr = __zend_realloc(ptr, new_size ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC);
31503218
tracked_add(heap, ptr, new_size);
31513219
heap->size += new_size - old_size;
3220+
ZEND_ASAN_UNPOISON_MEMORY_REGION(heap, sizeof(zend_mm_heap));
31523221
return ptr;
31533222
}
31543223

0 commit comments

Comments
 (0)