Skip to content

Commit 30acbba

Browse files
committed
Merge branch 'PHP-8.3'
* PHP-8.3: Fix leak of call->extra_named_params on internal __call
2 parents 2d8f7df + b7a468c commit 30acbba

File tree

6 files changed

+81
-1
lines changed

6 files changed

+81
-1
lines changed

Zend/zend_vm_def.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8887,6 +8887,9 @@ ZEND_VM_HANDLER(158, ZEND_CALL_TRAMPOLINE, ANY, ANY, SPEC(OBSERVER))
88878887
EG(current_execute_data) = call->prev_execute_data;
88888888

88898889
zend_vm_stack_free_args(call);
8890+
if (UNEXPECTED(call_info & ZEND_CALL_HAS_EXTRA_NAMED_PARAMS)) {
8891+
zend_free_extra_named_params(call->extra_named_params);
8892+
}
88908893
if (ret == &retval) {
88918894
zval_ptr_dtor(ret);
88928895
}

Zend/zend_vm_execute.h

Lines changed: 6 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

ext/zend_test/test.c

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ static zend_class_entry *zend_test_ns2_ns_foo_class;
7070
static zend_class_entry *zend_test_unit_enum;
7171
static zend_class_entry *zend_test_string_enum;
7272
static zend_class_entry *zend_test_int_enum;
73+
static zend_class_entry *zend_test_magic_call;
7374
static zend_object_handlers zend_test_class_handlers;
7475

7576
static int le_throwing_resource;
@@ -962,6 +963,24 @@ static ZEND_METHOD(ZendTestForbidDynamicCall, callStatic)
962963
zend_forbid_dynamic_call();
963964
}
964965

966+
static ZEND_METHOD(_ZendTestMagicCall, __call)
967+
{
968+
zend_string *name;
969+
zval *arguments;
970+
971+
ZEND_PARSE_PARAMETERS_START(2, 2)
972+
Z_PARAM_STR(name)
973+
Z_PARAM_ARRAY(arguments)
974+
ZEND_PARSE_PARAMETERS_END();
975+
976+
zval name_zv;
977+
ZVAL_STR(&name_zv, name);
978+
979+
zend_string_addref(name);
980+
Z_TRY_ADDREF_P(arguments);
981+
RETURN_ARR(zend_new_pair(&name_zv, arguments));
982+
}
983+
965984
PHP_INI_BEGIN()
966985
STD_PHP_INI_BOOLEAN("zend_test.replace_zend_execute_ex", "0", PHP_INI_SYSTEM, OnUpdateBool, replace_zend_execute_ex, zend_zend_test_globals, zend_test_globals)
967986
STD_PHP_INI_BOOLEAN("zend_test.register_passes", "0", PHP_INI_SYSTEM, OnUpdateBool, register_passes, zend_zend_test_globals, zend_test_globals)
@@ -1146,6 +1165,8 @@ PHP_MINIT_FUNCTION(zend_test)
11461165
zend_test_string_enum = register_class_ZendTestStringEnum();
11471166
zend_test_int_enum = register_class_ZendTestIntEnum();
11481167

1168+
zend_test_magic_call = register_class__ZendTestMagicCall();
1169+
11491170
zend_register_functions(NULL, ext_function_legacy, NULL, EG(current_module)->type);
11501171

11511172
// Loading via dl() not supported with the observer API

ext/zend_test/test.stub.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,11 @@ static public function variadicTest(string|Iterator ...$elements) : static {}
5757
public function takesUnionType(stdclass|Iterator $arg): void {}
5858
}
5959

60+
class _ZendTestMagicCall
61+
{
62+
public function __call(string $name, array $args): mixed {}
63+
}
64+
6065
class _ZendTestChildClass extends _ZendTestClass
6166
{
6267
public function returnsThrowable(): Exception {}

ext/zend_test/test_arginfo.h

Lines changed: 23 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
--TEST--
2+
GH-12835: call->extra_named_params leaks on internal __call
3+
--EXTENSIONS--
4+
zend_test
5+
--FILE--
6+
<?php
7+
$obj = new _ZendTestMagicCall;
8+
var_dump($obj->test('a', 'b', c: 'c'));
9+
?>
10+
--EXPECT--
11+
array(2) {
12+
[0]=>
13+
string(4) "test"
14+
[1]=>
15+
array(3) {
16+
[0]=>
17+
string(1) "a"
18+
[1]=>
19+
string(1) "b"
20+
["c"]=>
21+
string(1) "c"
22+
}
23+
}

0 commit comments

Comments
 (0)