Commit 0ceaea99b2c for php
commit 0ceaea99b2cc2b957a1b006d0ffd836e1bfaf43c
Author: Lazizbek Ergashev <lazerg2@gmail.com>
Date: Thu Oct 29 14:57:17 2026 +0500
Fix GH-25007: PFA named args in constant expression write out of bounds (#25012)
diff --git a/NEWS b/NEWS
index f26b0f190e0..8929fa19c5e 100644
--- a/NEWS
+++ b/NEWS
@@ -9,6 +9,8 @@ PHP NEWS
(Marti2203).
. Fixed bug GH-25023 (ZEND_CONTAINER_OF() fails to compile with -std=c11).
(lazerg)
+ . Fixed bug GH-25007 (Partial function application: named args in a constant
+ expression cause out-of-bounds write in zp_compile()). (lazerg)
- CLI:
. Fixed bug GH-24697 (PHP_HTTP_PARSER_STRICT build option doesn't work).
@@ -97,9 +99,9 @@ PHP NEWS
(ndossche, khaledalam)
- OpenSSL:
+ . Fixed build with OpenSSL 4.1. (Weilin Du)
. Fixed bug GH-24784 (openssl_pkcs7_read() and openssl_cms_read() overwrite
certificates with CRLs). (Alexander Danilov)
- . Fixed build with OpenSSL 4.1. (Weilin Du)
- PDO_PGSQL:
. Fixed bug GH-24461 (DISCARD ALL on persistent connection cleanup drops
diff --git a/Zend/tests/partial_application/gh25007.phpt b/Zend/tests/partial_application/gh25007.phpt
new file mode 100644
index 00000000000..99899a61577
--- /dev/null
+++ b/Zend/tests/partial_application/gh25007.phpt
@@ -0,0 +1,31 @@
+--TEST--
+GH-25007 (PFA in constexpr: named args before a named placeholder)
+--FILE--
+<?php
+
+function f($a, $b = 2, $c = 3) {
+ var_dump(func_get_args());
+}
+
+const C1 = f(a: 1, b: ?);
+const C2 = f(a: 1, c: ?, b: ?);
+
+(C1)(4);
+(C2)(5, 6);
+
+?>
+--EXPECT--
+array(2) {
+ [0]=>
+ int(1)
+ [1]=>
+ int(4)
+}
+array(3) {
+ [0]=>
+ int(1)
+ [1]=>
+ int(6)
+ [2]=>
+ int(5)
+}
diff --git a/Zend/zend_ast.c b/Zend/zend_ast.c
index e6b7dd32e28..e55a90001d2 100644
--- a/Zend/zend_ast.c
+++ b/Zend/zend_ast.c
@@ -701,14 +701,6 @@ static zend_execute_data *zend_ast_evaluate_arg_list(
if (!arg) {
goto fail;
}
- if (named_positions_ptr) {
- if (!*named_positions_ptr) {
- *named_positions_ptr = zend_new_array(0);
- }
- zval tmp;
- ZVAL_LONG(&tmp, zend_hash_num_elements(*named_positions_ptr));
- zend_hash_add(*named_positions_ptr, arg_name, &tmp);
- }
arg_ast = arg_ast->child[1];
} else {
arg = ZEND_CALL_VAR_NUM(frame, ZEND_CALL_NUM_ARGS(frame));
@@ -724,6 +716,14 @@ static zend_execute_data *zend_ast_evaluate_arg_list(
} else {
Z_TYPE_INFO_P(arg) = _IS_PLACEHOLDER;
}
+ if (arg_name && named_positions_ptr) {
+ if (!*named_positions_ptr) {
+ *named_positions_ptr = zend_new_array(0);
+ }
+ zval tmp;
+ ZVAL_LONG(&tmp, zend_hash_num_elements(*named_positions_ptr));
+ zend_hash_add(*named_positions_ptr, arg_name, &tmp);
+ }
} else {
if (zend_ast_evaluate_ex(arg, arg_ast, scope, short_circuited_ptr, ctx) == FAILURE) {
ZVAL_UNDEF(arg);