Skip to content

Commit dd3f1c0

Browse files
committed
Increase zend.reserved_stack_size minimum value in ASAN/MSAN builds
1 parent 7de83e2 commit dd3f1c0

14 files changed

+60
-14
lines changed

Zend/tests/stack_limit/stack_limit_001.phpt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ Stack limit 001 - Stack limit checks with max_allowed_stack_size detection
33
--SKIPIF--
44
<?php
55
if (!function_exists('zend_test_zend_call_stack_get')) die("skip zend_test_zend_call_stack_get() is not available");
6-
if (getenv('SKIP_MSAN')) die("skip msan requires a considerably higher zend.reserved_stack_size due to instrumentation");
76
?>
87
--EXTENSIONS--
98
zend_test

Zend/tests/stack_limit/stack_limit_002.phpt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ Stack limit 002 - Stack limit checks with max_allowed_stack_size detection (fibe
33
--SKIPIF--
44
<?php
55
if (!function_exists('zend_test_zend_call_stack_get')) die("skip zend_test_zend_call_stack_get() is not available");
6-
if (getenv('SKIP_MSAN')) die("skip msan requires a considerably higher zend.reserved_stack_size due to instrumentation");
76
?>
87
--EXTENSIONS--
98
zend_test

Zend/tests/stack_limit/stack_limit_003.phpt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ if (!function_exists('zend_test_zend_call_stack_get')) die("skip zend_test_zend_
77
--EXTENSIONS--
88
zend_test
99
--INI--
10-
zend.max_allowed_stack_size=128K
10+
zend.max_allowed_stack_size=512K
1111
--FILE--
1212
<?php
1313

Zend/tests/stack_limit/stack_limit_004.phpt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,12 +27,12 @@ $callback = function (): int {
2727
throw new \Exception();
2828
};
2929

30-
ini_set('fiber.stack_size', '400K');
30+
ini_set('fiber.stack_size', '1M');
3131
$fiber = new Fiber($callback);
3232
$fiber->start();
3333
$depth1 = $fiber->getReturn();
3434

35-
ini_set('fiber.stack_size', '200K');
35+
ini_set('fiber.stack_size', '512K');
3636
$fiber = new Fiber($callback);
3737
$fiber->start();
3838
$depth2 = $fiber->getReturn();

Zend/tests/stack_limit/stack_limit_006.phpt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ Stack limit 006 - env size affects __libc_stack_end
33
--SKIPIF--
44
<?php
55
if (!function_exists('zend_test_zend_call_stack_get')) die("skip zend_test_zend_call_stack_get() is not available");
6-
if (getenv('SKIP_MSAN')) die("skip msan requires a considerably higher zend.reserved_stack_size due to instrumentation");
76
?>
87
--EXTENSIONS--
98
zend_test

Zend/tests/stack_limit/stack_limit_007.phpt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ if (!function_exists('zend_test_zend_call_stack_get')) die("skip zend_test_zend_
77
--EXTENSIONS--
88
zend_test
99
--INI--
10-
zend.max_allowed_stack_size=128K
10+
zend.max_allowed_stack_size=512K
1111
--FILE--
1212
<?php
1313

Zend/tests/stack_limit/stack_limit_008.phpt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ if (!function_exists('zend_test_zend_call_stack_get')) die("skip zend_test_zend_
77
--EXTENSIONS--
88
zend_test
99
--INI--
10-
zend.max_allowed_stack_size=128K
10+
zend.max_allowed_stack_size=512K
1111
--FILE--
1212
<?php
1313

Zend/tests/stack_limit/stack_limit_009.phpt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ Stack limit 009 - Check that we can actually use all the stack
33
--SKIPIF--
44
<?php
55
if (!function_exists('zend_test_zend_call_stack_get')) die("skip zend_test_zend_call_stack_get() is not available");
6-
if (getenv('SKIP_MSAN')) die("skip msan requires a considerably higher zend.reserved_stack_size due to instrumentation");
76
?>
87
--EXTENSIONS--
98
zend_test

Zend/tests/stack_limit/stack_limit_011.phpt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ if (!function_exists('zend_test_zend_call_stack_get')) die("skip zend_test_zend_
77
--EXTENSIONS--
88
zend_test
99
--INI--
10-
zend.max_allowed_stack_size=128K
10+
zend.max_allowed_stack_size=512K
1111
--FILE--
1212
<?php
1313

Zend/tests/stack_limit/stack_limit_012.phpt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ if (!function_exists('zend_test_zend_call_stack_get')) die("skip zend_test_zend_
77
--EXTENSIONS--
88
zend_test
99
--INI--
10-
zend.max_allowed_stack_size=128K
10+
zend.max_allowed_stack_size=512K
1111
--FILE--
1212
<?php
1313

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
--TEST--
2+
Stack limit 013 - Fuzzer
3+
--SKIPIF--
4+
<?php
5+
if (!function_exists('zend_test_zend_call_stack_get')) die("skip zend_test_zend_call_stack_get() is not available");
6+
?>
7+
--EXTENSIONS--
8+
zend_test
9+
--INI--
10+
; The test may use a large amount of memory on systems with a large stack limit
11+
memory_limit=2G
12+
--FILE--
13+
<?php
14+
15+
try {
16+
if (!class_exists("constructs_in_destructor")) {
17+
class constructs_in_destructor {
18+
public function __destruct() {
19+
for ($i = 0; $i < 10000; ++$i) {
20+
$a = new constructs_in_destructor;
21+
$time = '';
22+
require(__FILE__);
23+
}
24+
}
25+
}
26+
}
27+
28+
$a = new constructs_in_destructor;
29+
} catch (Error $e) {
30+
echo $e->getMessage(), "\n";
31+
}
32+
33+
?>
34+
--EXPECTF--
35+
%SMaximum call stack size of %d bytes reached%s

Zend/zend.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,12 @@ static ZEND_INI_MH(OnUpdateReservedStackSize) /* {{{ */
206206
zend_ulong min = 32*1024;
207207
#endif
208208

209+
#if defined(__SANITIZE_ADDRESS__) || __has_feature(memory_sanitizer)
210+
/* AddressSanitizer and MemorySanitizer use more stack due to
211+
* instrumentation */
212+
min *= 10;
213+
#endif
214+
209215
if (size == 0) {
210216
size = min;
211217
} else if (size < min) {

Zend/zend_compile.c

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10451,9 +10451,13 @@ static void zend_compile_expr(znode *result, zend_ast *ast)
1045110451
{
1045210452
#ifdef ZEND_CHECK_STACK_LIMIT
1045310453
if (UNEXPECTED(zend_call_stack_overflowed(EG(stack_limit)))) {
10454+
size_t max_stack_size = 0;
10455+
if ((uintptr_t) EG(stack_base) > (uintptr_t) EG(stack_limit)) {
10456+
max_stack_size = (size_t) ((uintptr_t) EG(stack_base) - (uintptr_t) EG(stack_limit));
10457+
}
1045410458
zend_error_noreturn(E_COMPILE_ERROR,
1045510459
"Maximum call stack size of %zu bytes reached during compilation. Try splitting expression",
10456-
(size_t) ((uintptr_t) EG(stack_base) - (uintptr_t) EG(stack_limit)));
10460+
max_stack_size);
1045710461
}
1045810462
#endif /* ZEND_CHECK_STACK_LIMIT */
1045910463

Zend/zend_execute.c

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2262,8 +2262,13 @@ static zend_never_inline ZEND_COLD void ZEND_FASTCALL zend_use_new_element_for_s
22622262
#ifdef ZEND_CHECK_STACK_LIMIT
22632263
static zend_never_inline ZEND_COLD void ZEND_FASTCALL zend_call_stack_size_error(void)
22642264
{
2265-
zend_throw_error(NULL, "Maximum call stack size of %zu bytes reached. Infinite recursion?",
2266-
(size_t) ((uintptr_t) EG(stack_base) - (uintptr_t) EG(stack_limit)));
2265+
size_t max_stack_size = 0;
2266+
if ((uintptr_t) EG(stack_base) > (uintptr_t) EG(stack_limit)) {
2267+
max_stack_size = (size_t) ((uintptr_t) EG(stack_base) - (uintptr_t) EG(stack_limit));
2268+
}
2269+
zend_throw_error(NULL,
2270+
"Maximum call stack size of %zu bytes reached. Infinite recursion?",
2271+
max_stack_size);
22672272
}
22682273
#endif /* ZEND_CHECK_STACK_LIMIT */
22692274

0 commit comments

Comments
 (0)