Skip to content

Commit 4f91af3

Browse files
committed
Merge branch 'PHP-8.3' into PHP-8.4
* PHP-8.3: Fix stack overflow detection for variable compilation
2 parents 18d9667 + 333f5dd commit 4f91af3

File tree

3 files changed

+79
-0
lines changed

3 files changed

+79
-0
lines changed

NEWS

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,10 @@ PHP NEWS
55
- BCMath:
66
. Fixed bug GH-17398 (bcmul memory leak). (SakiTakamachi)
77

8+
- Core:
9+
. Fixed bug GH-17623 (Broken stack overflow detection for variable
10+
compilation). (ilutov)
11+
812
- DOM:
913
. Fixed bug GH-17609 (Typo in error message: Dom\NO_DEFAULT_NS instead of
1014
Dom\HTML_NO_DEFAULT_NS). (nielsdos)
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
--TEST--
2+
Stack limit 015 - Internal stack limit check in zend_compile_var()
3+
--CREDITS--
4+
abdullahasif88
5+
--SKIPIF--
6+
<?php
7+
if (!function_exists('zend_test_zend_call_stack_get')) die("skip zend_test_zend_call_stack_get() is not available");
8+
?>
9+
--EXTENSIONS--
10+
zend_test
11+
--INI--
12+
zend.max_allowed_stack_size=128K
13+
--FILE--
14+
<?php
15+
16+
$test
17+
->p->p->p->p->p->p->p->p->p->p
18+
->p->p->p->p->p->p->p->p->p->p
19+
->p->p->p->p->p->p->p->p->p->p
20+
->p->p->p->p->p->p->p->p->p->p
21+
->p->p->p->p->p->p->p->p->p->p
22+
->p->p->p->p->p->p->p->p->p->p
23+
->p->p->p->p->p->p->p->p->p->p
24+
->p->p->p->p->p->p->p->p->p->p
25+
->p->p->p->p->p->p->p->p->p->p
26+
->p->p->p->p->p->p->p->p->p->p
27+
->p->p->p->p->p->p->p->p->p->p
28+
->p->p->p->p->p->p->p->p->p->p
29+
->p->p->p->p->p->p->p->p->p->p
30+
->p->p->p->p->p->p->p->p->p->p
31+
->p->p->p->p->p->p->p->p->p->p
32+
->p->p->p->p->p->p->p->p->p->p
33+
->p->p->p->p->p->p->p->p->p->p
34+
->p->p->p->p->p->p->p->p->p->p
35+
->p->p->p->p->p->p->p->p->p->p
36+
->p->p->p->p->p->p->p->p->p->p
37+
->p->p->p->p->p->p->p->p->p->p
38+
->p->p->p->p->p->p->p->p->p->p
39+
->p->p->p->p->p->p->p->p->p->p
40+
->p->p->p->p->p->p->p->p->p->p
41+
->p->p->p->p->p->p->p->p->p->p
42+
->p->p->p->p->p->p->p->p->p->p
43+
->p->p->p->p->p->p->p->p->p->p
44+
->p->p->p->p->p->p->p->p->p->p
45+
->p->p->p->p->p->p->p->p->p->p
46+
->p->p->p->p->p->p->p->p->p->p
47+
->p->p->p->p->p->p->p->p->p->p
48+
->p->p->p->p->p->p->p->p->p->p
49+
->p->p->p->p->p->p->p->p->p->p
50+
->p->p->p->p->p->p->p->p->p->p
51+
->p->p->p->p->p->p->p->p->p->p
52+
->p->p->p->p->p->p->p->p->p->p
53+
->p->p->p->p->p->p->p->p->p->p
54+
->p->p->p->p->p->p->p->p->p->p
55+
->p->p->p->p->p->p->p->p->p->p
56+
->p->p->p->p->p->p->p->p->p->p
57+
->p->p->p->p->p->p->p->p->p->p
58+
->p->p->p->p->p->p->p->p->p->p
59+
->p->p->p->p->p->p->p->p->p->p
60+
->p->p->p->p->p->p->p->p->p->p
61+
->p->p->p->p->p->p->p->p->p->p
62+
->p->p->p->p->p->p->p->p->p->p
63+
->p->p->p->p->p->p->p->p->p->p
64+
->p->p->p->p->p->p->p->p->p->p
65+
->p->p->p->p->p->p->p->p->p->p
66+
->p->p->p->p->p->p->p->p->p->p
67+
;
68+
69+
?>
70+
--EXPECTF--
71+
Fatal error: Maximum call stack size of %d bytes (zend.max_allowed_stack_size - zend.reserved_stack_size) reached during compilation. Try splitting expression in %s on line %d

Zend/zend_compile.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11633,6 +11633,8 @@ static zend_op *zend_compile_var_inner(znode *result, zend_ast *ast, uint32_t ty
1163311633

1163411634
static zend_op *zend_compile_var(znode *result, zend_ast *ast, uint32_t type, bool by_ref) /* {{{ */
1163511635
{
11636+
zend_check_stack_limit();
11637+
1163611638
uint32_t checkpoint = zend_short_circuiting_checkpoint();
1163711639
zend_op *opcode = zend_compile_var_inner(result, ast, type, by_ref);
1163811640
zend_short_circuiting_commit(checkpoint, result, ast);
@@ -11641,6 +11643,8 @@ static zend_op *zend_compile_var(znode *result, zend_ast *ast, uint32_t type, bo
1164111643

1164211644
static zend_op *zend_delayed_compile_var(znode *result, zend_ast *ast, uint32_t type, bool by_ref) /* {{{ */
1164311645
{
11646+
zend_check_stack_limit();
11647+
1164411648
switch (ast->kind) {
1164511649
case ZEND_AST_VAR:
1164611650
return zend_compile_simple_var(result, ast, type, 1);

0 commit comments

Comments
 (0)