Skip to content

Commit 492621f

Browse files
committed
Fix memory leak on unknown named param
1 parent d7d2b06 commit 492621f

File tree

3 files changed

+46
-0
lines changed

3 files changed

+46
-0
lines changed

Zend/tests/named_params/unknown_named_param.phpt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,12 @@ try {
1515
echo $e->getMessage(), "\n";
1616
}
1717

18+
try {
19+
test(b: new stdClass);
20+
} catch (Error $e) {
21+
echo $e->getMessage(), "\n";
22+
}
23+
1824
try {
1925
test(b: 2, a: 1);
2026
} catch (Error $e) {
@@ -31,3 +37,4 @@ try {
3137
--EXPECT--
3238
Unknown named parameter $b
3339
Unknown named parameter $b
40+
Unknown named parameter $b

Zend/zend_vm_def.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4570,6 +4570,7 @@ ZEND_VM_HOT_HANDLER(65, ZEND_SEND_VAL, CONST|TMPVAR, CONST|UNUSED|NUM)
45704570
uint32_t arg_num;
45714571
arg = zend_handle_named_arg(&EX(call), arg_name, &arg_num, CACHE_ADDR(opline->result.num));
45724572
if (UNEXPECTED(!arg)) {
4573+
FREE_OP1();
45734574
HANDLE_EXCEPTION();
45744575
}
45754576
} else {
@@ -4611,6 +4612,7 @@ ZEND_VM_HOT_SEND_HANDLER(116, ZEND_SEND_VAL_EX, CONST|TMP, CONST|UNUSED|NUM, SPE
46114612
zend_string *arg_name = Z_STR_P(RT_CONSTANT(opline, opline->op2));
46124613
arg = zend_handle_named_arg(&EX(call), arg_name, &arg_num, CACHE_ADDR(opline->result.num));
46134614
if (UNEXPECTED(!arg)) {
4615+
FREE_OP1();
46144616
HANDLE_EXCEPTION();
46154617
}
46164618
} else {
@@ -4647,6 +4649,7 @@ ZEND_VM_HOT_HANDLER(117, ZEND_SEND_VAR, VAR|CV, CONST|UNUSED|NUM)
46474649
uint32_t arg_num;
46484650
arg = zend_handle_named_arg(&EX(call), arg_name, &arg_num, CACHE_ADDR(opline->result.num));
46494651
if (UNEXPECTED(!arg)) {
4652+
FREE_OP1();
46504653
HANDLE_EXCEPTION();
46514654
}
46524655
} else {
@@ -4693,6 +4696,7 @@ ZEND_VM_HANDLER(106, ZEND_SEND_VAR_NO_REF, VAR, CONST|UNUSED|NUM)
46934696
uint32_t arg_num;
46944697
arg = zend_handle_named_arg(&EX(call), arg_name, &arg_num, CACHE_ADDR(opline->result.num));
46954698
if (UNEXPECTED(!arg)) {
4699+
FREE_OP1();
46964700
HANDLE_EXCEPTION();
46974701
}
46984702
} else {
@@ -4723,6 +4727,7 @@ ZEND_VM_HOT_SEND_HANDLER(50, ZEND_SEND_VAR_NO_REF_EX, VAR, CONST|UNUSED|NUM, SPE
47234727
zend_string *arg_name = Z_STR_P(RT_CONSTANT(opline, opline->op2));
47244728
arg = zend_handle_named_arg(&EX(call), arg_name, &arg_num, CACHE_ADDR(opline->result.num));
47254729
if (UNEXPECTED(!arg)) {
4730+
FREE_OP1();
47264731
HANDLE_EXCEPTION();
47274732
}
47284733
} else {
@@ -4790,6 +4795,7 @@ ZEND_VM_HANDLER(67, ZEND_SEND_REF, VAR|CV, CONST|UNUSED|NUM)
47904795
uint32_t arg_num;
47914796
arg = zend_handle_named_arg(&EX(call), arg_name, &arg_num, CACHE_ADDR(opline->result.num));
47924797
if (UNEXPECTED(!arg)) {
4798+
FREE_OP1();
47934799
HANDLE_EXCEPTION();
47944800
}
47954801
} else {
@@ -4819,6 +4825,7 @@ ZEND_VM_HOT_SEND_HANDLER(66, ZEND_SEND_VAR_EX, VAR|CV, CONST|UNUSED|NUM, SPEC(QU
48194825
zend_string *arg_name = Z_STR_P(RT_CONSTANT(opline, opline->op2));
48204826
arg = zend_handle_named_arg(&EX(call), arg_name, &arg_num, CACHE_ADDR(opline->result.num));
48214827
if (UNEXPECTED(!arg)) {
4828+
FREE_OP1();
48224829
HANDLE_EXCEPTION();
48234830
}
48244831
} else {
@@ -4918,6 +4925,7 @@ ZEND_VM_HOT_HANDLER(185, ZEND_SEND_FUNC_ARG, VAR, CONST|UNUSED|NUM)
49184925
uint32_t arg_num;
49194926
arg = zend_handle_named_arg(&EX(call), arg_name, &arg_num, CACHE_ADDR(opline->result.num));
49204927
if (UNEXPECTED(!arg)) {
4928+
FREE_OP1();
49214929
HANDLE_EXCEPTION();
49224930
}
49234931
} else {

Zend/zend_vm_execute.h

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6072,6 +6072,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_VAL_SPEC_CONS
60726072
uint32_t arg_num;
60736073
arg = zend_handle_named_arg(&EX(call), arg_name, &arg_num, CACHE_ADDR(opline->result.num));
60746074
if (UNEXPECTED(!arg)) {
6075+
60756076
HANDLE_EXCEPTION();
60766077
}
60776078
} else {
@@ -6099,6 +6100,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_VAL_EX_SPEC_CONST_CONST_H
60996100
zend_string *arg_name = Z_STR_P(RT_CONSTANT(opline, opline->op2));
61006101
arg = zend_handle_named_arg(&EX(call), arg_name, &arg_num, CACHE_ADDR(opline->result.num));
61016102
if (UNEXPECTED(!arg)) {
6103+
61026104
HANDLE_EXCEPTION();
61036105
}
61046106
} else {
@@ -9106,6 +9108,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_VAL_SPEC_CONS
91069108
uint32_t arg_num;
91079109
arg = zend_handle_named_arg(&EX(call), arg_name, &arg_num, CACHE_ADDR(opline->result.num));
91089110
if (UNEXPECTED(!arg)) {
9111+
91099112
HANDLE_EXCEPTION();
91109113
}
91119114
} else {
@@ -9133,6 +9136,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_VAL_EX_SPEC_CONST_UNUSED_
91339136
zend_string *arg_name = Z_STR_P(RT_CONSTANT(opline, opline->op2));
91349137
arg = zend_handle_named_arg(&EX(call), arg_name, &arg_num, CACHE_ADDR(opline->result.num));
91359138
if (UNEXPECTED(!arg)) {
9139+
91369140
HANDLE_EXCEPTION();
91379141
}
91389142
} else {
@@ -9169,6 +9173,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_VAL_EX_SPEC_C
91699173
zend_string *arg_name = Z_STR_P(RT_CONSTANT(opline, opline->op2));
91709174
arg = zend_handle_named_arg(&EX(call), arg_name, &arg_num, CACHE_ADDR(opline->result.num));
91719175
if (UNEXPECTED(!arg)) {
9176+
91729177
HANDLE_EXCEPTION();
91739178
}
91749179
} else {
@@ -14922,6 +14927,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_VAL_SPEC_TMPV
1492214927
uint32_t arg_num;
1492314928
arg = zend_handle_named_arg(&EX(call), arg_name, &arg_num, CACHE_ADDR(opline->result.num));
1492414929
if (UNEXPECTED(!arg)) {
14930+
zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
1492514931
HANDLE_EXCEPTION();
1492614932
}
1492714933
} else {
@@ -16724,6 +16730,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_VAL_SPEC_TMPV
1672416730
uint32_t arg_num;
1672516731
arg = zend_handle_named_arg(&EX(call), arg_name, &arg_num, CACHE_ADDR(opline->result.num));
1672616732
if (UNEXPECTED(!arg)) {
16733+
zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
1672716734
HANDLE_EXCEPTION();
1672816735
}
1672916736
} else {
@@ -18609,6 +18616,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_VAL_EX_SPEC_TMP_CONST_HAN
1860918616
zend_string *arg_name = Z_STR_P(RT_CONSTANT(opline, opline->op2));
1861018617
arg = zend_handle_named_arg(&EX(call), arg_name, &arg_num, CACHE_ADDR(opline->result.num));
1861118618
if (UNEXPECTED(!arg)) {
18619+
zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
1861218620
HANDLE_EXCEPTION();
1861318621
}
1861418622
} else {
@@ -19432,6 +19440,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_VAL_EX_SPEC_TMP_UNUSED_HA
1943219440
zend_string *arg_name = Z_STR_P(RT_CONSTANT(opline, opline->op2));
1943319441
arg = zend_handle_named_arg(&EX(call), arg_name, &arg_num, CACHE_ADDR(opline->result.num));
1943419442
if (UNEXPECTED(!arg)) {
19443+
zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
1943519444
HANDLE_EXCEPTION();
1943619445
}
1943719446
} else {
@@ -19468,6 +19477,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_VAL_EX_SPEC_T
1946819477
zend_string *arg_name = Z_STR_P(RT_CONSTANT(opline, opline->op2));
1946919478
arg = zend_handle_named_arg(&EX(call), arg_name, &arg_num, CACHE_ADDR(opline->result.num));
1947019479
if (UNEXPECTED(!arg)) {
19480+
zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
1947119481
HANDLE_EXCEPTION();
1947219482
}
1947319483
} else {
@@ -23147,6 +23157,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_VAR_SPEC_VAR_
2314723157
uint32_t arg_num;
2314823158
arg = zend_handle_named_arg(&EX(call), arg_name, &arg_num, CACHE_ADDR(opline->result.num));
2314923159
if (UNEXPECTED(!arg)) {
23160+
zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
2315023161
HANDLE_EXCEPTION();
2315123162
}
2315223163
} else {
@@ -23193,6 +23204,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_VAR_NO_REF_SPEC_VAR_CONST
2319323204
uint32_t arg_num;
2319423205
arg = zend_handle_named_arg(&EX(call), arg_name, &arg_num, CACHE_ADDR(opline->result.num));
2319523206
if (UNEXPECTED(!arg)) {
23207+
zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
2319623208
HANDLE_EXCEPTION();
2319723209
}
2319823210
} else {
@@ -23223,6 +23235,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_VAR_NO_REF_EX_SPEC_VAR_CO
2322323235
zend_string *arg_name = Z_STR_P(RT_CONSTANT(opline, opline->op2));
2322423236
arg = zend_handle_named_arg(&EX(call), arg_name, &arg_num, CACHE_ADDR(opline->result.num));
2322523237
if (UNEXPECTED(!arg)) {
23238+
zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
2322623239
HANDLE_EXCEPTION();
2322723240
}
2322823241
} else {
@@ -23290,6 +23303,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_REF_SPEC_VAR_CONST_HANDLE
2329023303
uint32_t arg_num;
2329123304
arg = zend_handle_named_arg(&EX(call), arg_name, &arg_num, CACHE_ADDR(opline->result.num));
2329223305
if (UNEXPECTED(!arg)) {
23306+
zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
2329323307
HANDLE_EXCEPTION();
2329423308
}
2329523309
} else {
@@ -23319,6 +23333,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_VAR_EX_SPEC_VAR_CONST_HAN
2331923333
zend_string *arg_name = Z_STR_P(RT_CONSTANT(opline, opline->op2));
2332023334
arg = zend_handle_named_arg(&EX(call), arg_name, &arg_num, CACHE_ADDR(opline->result.num));
2332123335
if (UNEXPECTED(!arg)) {
23336+
zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
2332223337
HANDLE_EXCEPTION();
2332323338
}
2332423339
} else {
@@ -23386,6 +23401,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_FUNC_ARG_SPEC
2338623401
uint32_t arg_num;
2338723402
arg = zend_handle_named_arg(&EX(call), arg_name, &arg_num, CACHE_ADDR(opline->result.num));
2338823403
if (UNEXPECTED(!arg)) {
23404+
zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
2338923405
HANDLE_EXCEPTION();
2339023406
}
2339123407
} else {
@@ -27019,6 +27035,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_VAR_SPEC_VAR_
2701927035
uint32_t arg_num;
2702027036
arg = zend_handle_named_arg(&EX(call), arg_name, &arg_num, CACHE_ADDR(opline->result.num));
2702127037
if (UNEXPECTED(!arg)) {
27038+
zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
2702227039
HANDLE_EXCEPTION();
2702327040
}
2702427041
} else {
@@ -27065,6 +27082,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_VAR_NO_REF_SPEC_VAR_UNUSE
2706527082
uint32_t arg_num;
2706627083
arg = zend_handle_named_arg(&EX(call), arg_name, &arg_num, CACHE_ADDR(opline->result.num));
2706727084
if (UNEXPECTED(!arg)) {
27085+
zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
2706827086
HANDLE_EXCEPTION();
2706927087
}
2707027088
} else {
@@ -27095,6 +27113,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_VAR_NO_REF_EX_SPEC_VAR_UN
2709527113
zend_string *arg_name = Z_STR_P(RT_CONSTANT(opline, opline->op2));
2709627114
arg = zend_handle_named_arg(&EX(call), arg_name, &arg_num, CACHE_ADDR(opline->result.num));
2709727115
if (UNEXPECTED(!arg)) {
27116+
zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
2709827117
HANDLE_EXCEPTION();
2709927118
}
2710027119
} else {
@@ -27162,6 +27181,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_VAR_NO_REF_EX
2716227181
zend_string *arg_name = Z_STR_P(RT_CONSTANT(opline, opline->op2));
2716327182
arg = zend_handle_named_arg(&EX(call), arg_name, &arg_num, CACHE_ADDR(opline->result.num));
2716427183
if (UNEXPECTED(!arg)) {
27184+
zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
2716527185
HANDLE_EXCEPTION();
2716627186
}
2716727187
} else {
@@ -27229,6 +27249,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_REF_SPEC_VAR_UNUSED_HANDL
2722927249
uint32_t arg_num;
2723027250
arg = zend_handle_named_arg(&EX(call), arg_name, &arg_num, CACHE_ADDR(opline->result.num));
2723127251
if (UNEXPECTED(!arg)) {
27252+
zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
2723227253
HANDLE_EXCEPTION();
2723327254
}
2723427255
} else {
@@ -27258,6 +27279,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_VAR_EX_SPEC_VAR_UNUSED_HA
2725827279
zend_string *arg_name = Z_STR_P(RT_CONSTANT(opline, opline->op2));
2725927280
arg = zend_handle_named_arg(&EX(call), arg_name, &arg_num, CACHE_ADDR(opline->result.num));
2726027281
if (UNEXPECTED(!arg)) {
27282+
zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
2726127283
HANDLE_EXCEPTION();
2726227284
}
2726327285
} else {
@@ -27324,6 +27346,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_VAR_EX_SPEC_V
2732427346
zend_string *arg_name = Z_STR_P(RT_CONSTANT(opline, opline->op2));
2732527347
arg = zend_handle_named_arg(&EX(call), arg_name, &arg_num, CACHE_ADDR(opline->result.num));
2732627348
if (UNEXPECTED(!arg)) {
27349+
zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
2732727350
HANDLE_EXCEPTION();
2732827351
}
2732927352
} else {
@@ -27391,6 +27414,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_FUNC_ARG_SPEC
2739127414
uint32_t arg_num;
2739227415
arg = zend_handle_named_arg(&EX(call), arg_name, &arg_num, CACHE_ADDR(opline->result.num));
2739327416
if (UNEXPECTED(!arg)) {
27417+
zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
2739427418
HANDLE_EXCEPTION();
2739527419
}
2739627420
} else {
@@ -40766,6 +40790,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_VAR_SPEC_CV_C
4076640790
uint32_t arg_num;
4076740791
arg = zend_handle_named_arg(&EX(call), arg_name, &arg_num, CACHE_ADDR(opline->result.num));
4076840792
if (UNEXPECTED(!arg)) {
40793+
4076940794
HANDLE_EXCEPTION();
4077040795
}
4077140796
} else {
@@ -40812,6 +40837,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_REF_SPEC_CV_CONST_HANDLER
4081240837
uint32_t arg_num;
4081340838
arg = zend_handle_named_arg(&EX(call), arg_name, &arg_num, CACHE_ADDR(opline->result.num));
4081440839
if (UNEXPECTED(!arg)) {
40840+
4081540841
HANDLE_EXCEPTION();
4081640842
}
4081740843
} else {
@@ -40840,6 +40866,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_VAR_EX_SPEC_CV_CONST_HAND
4084040866
zend_string *arg_name = Z_STR_P(RT_CONSTANT(opline, opline->op2));
4084140867
arg = zend_handle_named_arg(&EX(call), arg_name, &arg_num, CACHE_ADDR(opline->result.num));
4084240868
if (UNEXPECTED(!arg)) {
40869+
4084340870
HANDLE_EXCEPTION();
4084440871
}
4084540872
} else {
@@ -45883,6 +45910,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_VAR_SPEC_CV_U
4588345910
uint32_t arg_num;
4588445911
arg = zend_handle_named_arg(&EX(call), arg_name, &arg_num, CACHE_ADDR(opline->result.num));
4588545912
if (UNEXPECTED(!arg)) {
45913+
4588645914
HANDLE_EXCEPTION();
4588745915
}
4588845916
} else {
@@ -45929,6 +45957,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_REF_SPEC_CV_UNUSED_HANDLE
4592945957
uint32_t arg_num;
4593045958
arg = zend_handle_named_arg(&EX(call), arg_name, &arg_num, CACHE_ADDR(opline->result.num));
4593145959
if (UNEXPECTED(!arg)) {
45960+
4593245961
HANDLE_EXCEPTION();
4593345962
}
4593445963
} else {
@@ -45957,6 +45986,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_VAR_EX_SPEC_CV_UNUSED_HAN
4595745986
zend_string *arg_name = Z_STR_P(RT_CONSTANT(opline, opline->op2));
4595845987
arg = zend_handle_named_arg(&EX(call), arg_name, &arg_num, CACHE_ADDR(opline->result.num));
4595945988
if (UNEXPECTED(!arg)) {
45989+
4596045990
HANDLE_EXCEPTION();
4596145991
}
4596245992
} else {
@@ -46022,6 +46052,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_VAR_EX_SPEC_C
4602246052
zend_string *arg_name = Z_STR_P(RT_CONSTANT(opline, opline->op2));
4602346053
arg = zend_handle_named_arg(&EX(call), arg_name, &arg_num, CACHE_ADDR(opline->result.num));
4602446054
if (UNEXPECTED(!arg)) {
46055+
4602546056
HANDLE_EXCEPTION();
4602646057
}
4602746058
} else {

0 commit comments

Comments
 (0)