@@ -2697,23 +2697,29 @@ static zend_alloc_globals alloc_globals;
26972697ZEND_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
27062709ZEND_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)
27852796ZEND_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
27932806ZEND_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
28622885ZEND_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
28702895ZEND_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
28822911ZEND_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
28952926ZEND_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
29052941ZEND_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
29152956ZEND_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
29202964ZEND_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)
29973041ZEND_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
30213068ZEND_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)
30303080ZEND_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)
30433099ZEND_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)
30553116ZEND_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
31043167static 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
31313198static 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