Skip to content

Commit 46a49be

Browse files
committed
Fixed bug #80049
Type checking may convert to refcounted values, so force freeing of extra args.
1 parent 1848ccd commit 46a49be

File tree

4 files changed

+18
-0
lines changed

4 files changed

+18
-0
lines changed

NEWS

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ PHP NEWS
44

55
- Core:
66
. Fixed bug #80048 (Bug #69100 has not been fixed for Windows). (cmb)
7+
. Fixed bug #80049 (Memleak when coercing integers to string via variadic
8+
argument). (Nikita)
79

810
- Calendar:
911
. Fixed bug #80007 (Potential type confusion in unixtojd() parameter parsing).

Zend/tests/bug80049.phpt

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
--TEST--
2+
Bug #80049: Memleak when coercing integers to string via variadic argument
3+
--FILE--
4+
<?php
5+
function coerceToString(string ...$strings) {
6+
var_dump($strings);
7+
}
8+
coerceToString(...[123]);
9+
?>
10+
--EXPECT--
11+
array(1) {
12+
[0]=>
13+
string(3) "123"
14+
}

Zend/zend_vm_def.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4819,6 +4819,7 @@ ZEND_VM_HANDLER(164, ZEND_RECV_VARIADIC, NUM, UNUSED|CACHE_SLOT)
48194819
ZEND_HASH_FILL_PACKED(Z_ARRVAL_P(params)) {
48204820
param = EX_VAR_NUM(EX(func)->op_array.last_var + EX(func)->op_array.T);
48214821
if (UNEXPECTED((EX(func)->op_array.fn_flags & ZEND_ACC_HAS_TYPE_HINTS) != 0)) {
4822+
ZEND_ADD_CALL_FLAG(execute_data, ZEND_CALL_FREE_EXTRA_ARGS);
48224823
do {
48234824
zend_verify_arg_type(EX(func), arg_num, param, NULL, CACHE_ADDR(opline->op2.num));
48244825
if (Z_OPT_REFCOUNTED_P(param)) Z_ADDREF_P(param);

Zend/zend_vm_execute.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2375,6 +2375,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RECV_VARIADIC_SPEC_UNUSED_HAND
23752375
ZEND_HASH_FILL_PACKED(Z_ARRVAL_P(params)) {
23762376
param = EX_VAR_NUM(EX(func)->op_array.last_var + EX(func)->op_array.T);
23772377
if (UNEXPECTED((EX(func)->op_array.fn_flags & ZEND_ACC_HAS_TYPE_HINTS) != 0)) {
2378+
ZEND_ADD_CALL_FLAG(execute_data, ZEND_CALL_FREE_EXTRA_ARGS);
23782379
do {
23792380
zend_verify_arg_type(EX(func), arg_num, param, NULL, CACHE_ADDR(opline->op2.num));
23802381
if (Z_OPT_REFCOUNTED_P(param)) Z_ADDREF_P(param);

0 commit comments

Comments
 (0)