Skip to content

Commit d348c8d

Browse files
committed
More poisoning
1 parent 4da0e46 commit d348c8d

File tree

1 file changed

+43
-7
lines changed

1 file changed

+43
-7
lines changed

Zend/zend_alloc.c

Lines changed: 43 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -433,7 +433,6 @@ static ZEND_COLD ZEND_NORETURN void zend_mm_safe_error(zend_mm_heap *heap,
433433
#endif
434434
size_t size)
435435
{
436-
437436
heap->overflow = 1;
438437
zend_try {
439438
zend_error_noreturn(E_ERROR,
@@ -1028,6 +1027,7 @@ static void *zend_mm_alloc_pages(zend_mm_heap *heap, uint32_t pages_count ZEND_F
10281027
#else
10291028
zend_mm_safe_error(heap, "Allowed memory size of %zu bytes exhausted (tried to allocate %zu bytes)", heap->limit, ZEND_MM_PAGE_SIZE * pages_count);
10301029
#endif
1030+
ZEND_ASAN_POISON_MEMORY_REGION(chunk, sizeof(zend_mm_chunk));
10311031
return NULL;
10321032
}
10331033
}
@@ -1047,6 +1047,7 @@ static void *zend_mm_alloc_pages(zend_mm_heap *heap, uint32_t pages_count ZEND_F
10471047
#else
10481048
zend_mm_safe_error(heap, "Out of memory (allocated %zu bytes) (tried to allocate %zu bytes)", heap->real_size, ZEND_MM_PAGE_SIZE * pages_count);
10491049
#endif
1050+
ZEND_ASAN_POISON_MEMORY_REGION(chunk, sizeof(zend_mm_chunk));
10501051
return NULL;
10511052
}
10521053
}
@@ -1113,7 +1114,7 @@ static zend_always_inline void *zend_mm_alloc_large_ex(zend_mm_heap *heap, size_
11131114
#endif
11141115
#if ZEND_MM_STAT
11151116
do {
1116-
size_t size = heap->size + pages_count * ZEND_MM_PAGE_SIZE;
1117+
size_t size = heap->size + pages_count * ZEND_MM_PAGE_SIZE;
11171118
size_t peak = MAX(heap->peak, size);
11181119
heap->size = size;
11191120
heap->peak = peak;
@@ -1140,7 +1141,7 @@ static zend_always_inline void zend_mm_delete_chunk(zend_mm_heap *heap, zend_mm_
11401141

11411142
ZEND_ASAN_POISON_MEMORY_REGION(chunk->next, sizeof(zend_mm_chunk));
11421143
ZEND_ASAN_POISON_MEMORY_REGION(chunk->prev, sizeof(zend_mm_chunk));
1143-
1144+
11441145
heap->chunks_count--;
11451146
if (heap->chunks_count + heap->cached_chunks_count < heap->avg_chunks_count + 0.1
11461147
|| (heap->chunks_count == heap->last_chunks_delete_boundary
@@ -1545,6 +1546,7 @@ static zend_always_inline void *zend_mm_alloc_heap(zend_mm_heap *heap, size_t si
15451546
static zend_always_inline void zend_mm_free_heap(zend_mm_heap *heap, void *ptr ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC)
15461547
{
15471548
printf("Freeing %p\n", ptr);
1549+
15481550
size_t page_offset = ZEND_MM_ALIGNED_OFFSET(ptr, ZEND_MM_CHUNK_SIZE);
15491551

15501552
if (UNEXPECTED(page_offset == 0)) {
@@ -2131,6 +2133,7 @@ ZEND_API size_t zend_mm_gc(zend_mm_heap *heap)
21312133
bool has_free_pages;
21322134
size_t collected = 0;
21332135

2136+
ZEND_ASAN_UNPOISON_MEMORY_REGION(heap, sizeof(zend_mm_heap));
21342137
#if ZEND_MM_CUSTOM
21352138
if (heap->use_custom_heap) {
21362139
size_t (*gc)(void) = heap->custom_heap._gc;
@@ -2255,6 +2258,7 @@ ZEND_API size_t zend_mm_gc(zend_mm_heap *heap)
22552258
}
22562259
} while (chunk != heap->main_chunk);
22572260
ZEND_ASAN_POISON_MEMORY_REGION(chunk, sizeof(zend_mm_chunk));
2261+
ZEND_ASAN_POISON_MEMORY_REGION(heap, sizeof(zend_mm_heap));
22582262

22592263
printf("Done running gc\n");
22602264
return collected * ZEND_MM_PAGE_SIZE;
@@ -2460,6 +2464,7 @@ ZEND_API void zend_mm_shutdown(zend_mm_heap *heap, bool full, bool silent)
24602464
{
24612465
zend_mm_chunk *p;
24622466
zend_mm_huge_list *list;
2467+
ZEND_ASAN_UNPOISON_MEMORY_REGION(heap, sizeof(zend_mm_heap));
24632468

24642469
#if ZEND_MM_CUSTOM
24652470
if (heap->use_custom_heap) {
@@ -2486,6 +2491,7 @@ ZEND_API void zend_mm_shutdown(zend_mm_heap *heap, bool full, bool silent)
24862491
if (shutdown) {
24872492
shutdown(full, silent);
24882493
}
2494+
ZEND_ASAN_POISON_MEMORY_REGION(heap, sizeof(zend_mm_heap));
24892495

24902496
return;
24912497
}
@@ -2592,6 +2598,7 @@ ZEND_API void zend_mm_shutdown(zend_mm_heap *heap, bool full, bool silent)
25922598
}
25932599
ZEND_ASAN_POISON_MEMORY_REGION(p, sizeof(zend_mm_chunk));
25942600
}
2601+
ZEND_ASAN_POISON_MEMORY_REGION(heap, sizeof(zend_mm_heap));
25952602
}
25962603

25972604
/**************/
@@ -2613,22 +2620,29 @@ ZEND_API void ZEND_FASTCALL _zend_mm_validate(zend_mm_heap *heap)
26132620

26142621
ZEND_API void ZEND_FASTCALL zend_mm_validate_fast(zend_mm_heap *heap)
26152622
{
2623+
ZEND_ASAN_UNPOISON_MEMORY_REGION(heap, sizeof(zend_mm_heap));
26162624
for (int i = 0; i < 30; i++) {
26172625
zend_mm_free_slot *slot = heap->free_slot[i];
26182626
if (slot != NULL) {
26192627
zend_mm_get_next_free_slot(heap, i, slot);
26202628
}
26212629
}
2630+
ZEND_ASAN_POISON_MEMORY_REGION(heap, sizeof(zend_mm_heap));
26222631
}
26232632

26242633
ZEND_API void* ZEND_FASTCALL _zend_mm_alloc(zend_mm_heap *heap, size_t size ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC)
26252634
{
2626-
return zend_mm_alloc_heap(heap, size ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC);
2635+
ZEND_ASAN_UNPOISON_MEMORY_REGION(heap, sizeof(zend_mm_heap));
2636+
void *ptr = zend_mm_alloc_heap(heap, size ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC);
2637+
ZEND_ASAN_POISON_MEMORY_REGION(heap, sizeof(zend_mm_heap));
2638+
return ptr;
26272639
}
26282640

26292641
ZEND_API void ZEND_FASTCALL _zend_mm_free(zend_mm_heap *heap, void *ptr ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC)
26302642
{
2643+
ZEND_ASAN_UNPOISON_MEMORY_REGION(heap, sizeof(zend_mm_heap));
26312644
zend_mm_free_heap(heap, ptr ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC);
2645+
ZEND_ASAN_POISON_MEMORY_REGION(heap, sizeof(zend_mm_heap));
26322646
}
26332647

26342648
void* ZEND_FASTCALL _zend_mm_realloc(zend_mm_heap *heap, void *ptr, size_t size ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC)
@@ -2643,19 +2657,24 @@ void* ZEND_FASTCALL _zend_mm_realloc2(zend_mm_heap *heap, void *ptr, size_t size
26432657

26442658
ZEND_API size_t ZEND_FASTCALL _zend_mm_block_size(zend_mm_heap *heap, void *ptr ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC)
26452659
{
2660+
ZEND_ASAN_UNPOISON_MEMORY_REGION(heap, sizeof(zend_mm_heap));
26462661
#if ZEND_MM_CUSTOM
26472662
if (UNEXPECTED(heap->use_custom_heap)) {
26482663
if (heap->custom_heap._malloc == tracked_malloc) {
26492664
zend_ulong h = ((uintptr_t) ptr) >> ZEND_MM_ALIGNMENT_LOG2;
26502665
zval *size_zv = zend_hash_index_find(heap->tracked_allocs, h);
26512666
if (size_zv) {
2667+
ZEND_ASAN_POISON_MEMORY_REGION(heap, sizeof(zend_mm_heap));
26522668
return Z_LVAL_P(size_zv);
26532669
}
26542670
}
2671+
ZEND_ASAN_POISON_MEMORY_REGION(heap, sizeof(zend_mm_heap));
26552672
return 0;
26562673
}
26572674
#endif
2658-
return zend_mm_size(heap, ptr ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC);
2675+
size_t ret = zend_mm_size(heap, ptr ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC);
2676+
ZEND_ASAN_POISON_MEMORY_REGION(heap, sizeof(zend_mm_heap));
2677+
return ret;
26592678
}
26602679

26612680
/**********************/
@@ -2834,7 +2853,9 @@ ZEND_API void ZEND_FASTCALL _efree_large(void *ptr, size_t size)
28342853
ZEND_MM_ASSERT(ZEND_MM_LRUN_PAGES(chunk->map[page_num]) == pages_count);
28352854
ZEND_ASAN_POISON_MEMORY_REGION(chunk, sizeof(zend_mm_chunk));
28362855

2856+
ZEND_ASAN_UNPOISON_MEMORY_REGION(AG(mm_heap), sizeof(zend_mm_heap));
28372857
zend_mm_free_large(AG(mm_heap), chunk, page_num, pages_count);
2858+
ZEND_ASAN_POISON_MEMORY_REGION(AG(mm_heap), sizeof(zend_mm_heap));
28382859
}
28392860
}
28402861

@@ -3219,7 +3240,10 @@ ZEND_API zend_mm_heap *zend_mm_get_heap(void)
32193240
ZEND_API bool zend_mm_is_custom_heap(zend_mm_heap *new_heap)
32203241
{
32213242
#if ZEND_MM_CUSTOM
3222-
return AG(mm_heap)->use_custom_heap;
3243+
ZEND_ASAN_UNPOISON_MEMORY_REGION(heap, sizeof(zend_mm_heap));
3244+
bool ret = AG(mm_heap)->use_custom_heap;
3245+
ZEND_ASAN_POISON_MEMORY_REGION(heap, sizeof(zend_mm_heap));
3246+
return ret;
32233247
#else
32243248
return 0;
32253249
#endif
@@ -3231,7 +3255,9 @@ ZEND_API void zend_mm_set_custom_handlers(zend_mm_heap *heap,
32313255
void* (*_realloc)(void*, size_t ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC))
32323256
{
32333257
#if ZEND_MM_CUSTOM
3258+
ZEND_ASAN_UNPOISON_MEMORY_REGION(heap, sizeof(zend_mm_heap));
32343259
zend_mm_set_custom_handlers_ex(heap, _malloc, _free, _realloc, NULL, NULL);
3260+
ZEND_ASAN_POISON_MEMORY_REGION(heap, sizeof(zend_mm_heap));
32353261
#endif
32363262
}
32373263

@@ -3243,6 +3269,7 @@ ZEND_API void zend_mm_set_custom_handlers_ex(zend_mm_heap *heap,
32433269
void (*_shutdown)(bool, bool))
32443270
{
32453271
#if ZEND_MM_CUSTOM
3272+
ZEND_ASAN_UNPOISON_MEMORY_REGION(heap, sizeof(zend_mm_heap));
32463273
zend_mm_heap *_heap = (zend_mm_heap*)heap;
32473274

32483275
if (!_malloc && !_free && !_realloc) {
@@ -3255,6 +3282,7 @@ ZEND_API void zend_mm_set_custom_handlers_ex(zend_mm_heap *heap,
32553282
_heap->custom_heap._gc = _gc;
32563283
_heap->custom_heap._shutdown = _shutdown;
32573284
}
3285+
ZEND_ASAN_POISON_MEMORY_REGION(heap, sizeof(zend_mm_heap));
32583286
#endif
32593287
}
32603288

@@ -3264,7 +3292,9 @@ ZEND_API void zend_mm_get_custom_handlers(zend_mm_heap *heap,
32643292
void* (**_realloc)(void*, size_t ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC))
32653293
{
32663294
#if ZEND_MM_CUSTOM
3295+
ZEND_ASAN_UNPOISON_MEMORY_REGION(heap, sizeof(zend_mm_heap));
32673296
zend_mm_get_custom_handlers_ex(heap, _malloc, _free, _realloc, NULL, NULL);
3297+
ZEND_ASAN_POISON_MEMORY_REGION(heap, sizeof(zend_mm_heap));
32683298
#endif
32693299
}
32703300

@@ -3276,6 +3306,8 @@ ZEND_API void zend_mm_get_custom_handlers_ex(zend_mm_heap *heap,
32763306
void (**_shutdown)(bool, bool))
32773307
{
32783308
#if ZEND_MM_CUSTOM
3309+
ZEND_ASAN_UNPOISON_MEMORY_REGION(_heap, sizeof(zend_mm_heap));
3310+
32793311
zend_mm_heap *_heap = (zend_mm_heap*)heap;
32803312

32813313
if (heap->use_custom_heap) {
@@ -3299,6 +3331,7 @@ ZEND_API void zend_mm_get_custom_handlers_ex(zend_mm_heap *heap,
32993331
*_shutdown = NULL;
33003332
}
33013333
}
3334+
ZEND_ASAN_POISON_MEMORY_REGION(heap, sizeof(zend_mm_heap));
33023335
#else
33033336
*_malloc = NULL;
33043337
*_free = NULL;
@@ -3311,7 +3344,10 @@ ZEND_API void zend_mm_get_custom_handlers_ex(zend_mm_heap *heap,
33113344
ZEND_API zend_mm_storage *zend_mm_get_storage(zend_mm_heap *heap)
33123345
{
33133346
#if ZEND_MM_STORAGE
3314-
return heap->storage;
3347+
ZEND_ASAN_UNPOISON_MEMORY_REGION(heap, sizeof(zend_mm_heap));
3348+
zend_mm_storage *ret = heap->storage;
3349+
ZEND_ASAN_POISON_MEMORY_REGION(heap, sizeof(zend_mm_heap));
3350+
return ret;
33153351
#else
33163352
return NULL
33173353
#endif

0 commit comments

Comments
 (0)