diff --git a/Zend/zend_fibers.c b/Zend/zend_fibers.c index ea91219a43a0..81e6e8832a06 100644 --- a/Zend/zend_fibers.c +++ b/Zend/zend_fibers.c @@ -62,6 +62,7 @@ #endif #ifdef __SANITIZE_ADDRESS__ +# include # include #endif @@ -257,6 +258,12 @@ static void zend_fiber_stack_free(zend_fiber_stack *stack) void *pointer = (void *) ((uintptr_t) stack->pointer - ZEND_FIBER_GUARD_PAGES * page_size); +#ifdef __SANITIZE_ADDRESS__ + /* If another mmap happens after unmapping, it may trigger the stale stack red zones + * so we have to unpoison it before unmapping. */ + ASAN_UNPOISON_MEMORY_REGION(pointer, stack->size + ZEND_FIBER_GUARD_PAGES * page_size); +#endif + #ifdef ZEND_WIN32 VirtualFree(pointer, 0, MEM_RELEASE); #else