From b320aabc5e875ef101510eb39ea3b40e351dc6a5 Mon Sep 17 00:00:00 2001 From: David Carlier Date: Sat, 3 Feb 2024 14:54:23 +0000 Subject: [PATCH] zend call stack fixing stack limit for macOs arm64. 8MB sounded a prudent size for older 10.9 macOs release, however with newer mac with arm64, it triggers a stack overflow. close GH-13319 --- NEWS | 1 + Zend/tests/stack_limit/stack_limit_010.phpt | 5 ++++- Zend/zend_call_stack.c | 9 +++++++-- 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/NEWS b/NEWS index 6effae7aecb..ba1164f2e21 100644 --- a/NEWS +++ b/NEWS @@ -12,6 +12,7 @@ PHP NEWS . Fixed bug GH-13178 (Iterator positions incorrect when converting packed array to hashed). (ilutov) . Fixed zend fiber build for solaris default mode (32 bits). (David Carlier) + . Fixed zend call stack size for macOs/arm64. (David Carlier) - Curl: . Deprecated the CURLOPT_BINARYTRANSFER constant. (divinity76) diff --git a/Zend/tests/stack_limit/stack_limit_010.phpt b/Zend/tests/stack_limit/stack_limit_010.phpt index 312c2cf5516..9e37555e6de 100644 --- a/Zend/tests/stack_limit/stack_limit_010.phpt +++ b/Zend/tests/stack_limit/stack_limit_010.phpt @@ -15,7 +15,10 @@ $stack = zend_test_zend_call_stack_get(); var_dump($stack); $expectedMaxSize = match(php_uname('s')) { - 'Darwin' => 8*1024*1024, + 'Darwin' => match(php_uname('m')) { + 'x86_64' => 8*1024*1024, + 'arm64' => 8372224, + }, 'FreeBSD' => match(php_uname('m')) { 'amd64' => 512*1024*1024 - 4096, 'i386' => 64*1024*1024 - 4096, diff --git a/Zend/zend_call_stack.c b/Zend/zend_call_stack.c index dd3a48533af..f24617d93f0 100644 --- a/Zend/zend_call_stack.c +++ b/Zend/zend_call_stack.c @@ -427,7 +427,9 @@ static bool zend_call_stack_get_macos(zend_call_stack *stack) void *base = pthread_get_stackaddr_np(pthread_self()); size_t max_size; - if (pthread_main_np()) { +#if !defined(__aarch64__) + if (pthread_main_np()) + { /* pthread_get_stacksize_np() returns a too low value for the main * thread in OSX 10.9, 10.10: * https://mail.openjdk.org/pipermail/hotspot-dev/2013-October/011353.html @@ -437,7 +439,10 @@ static bool zend_call_stack_get_macos(zend_call_stack *stack) /* Stack size is 8MiB by default for main threads * https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/Multithreading/CreatingThreads/CreatingThreads.html */ max_size = 8 * 1024 * 1024; - } else { + } + else +#endif + { max_size = pthread_get_stacksize_np(pthread_self()); }