Skip to content

Commit ee89e73

Browse files
committed
Merge branch 'PHP-7.3' into PHP-7.4
* PHP-7.3: Fix freeing of dynamic call name
2 parents 0301ab7 + 189f625 commit ee89e73

File tree

3 files changed

+30
-10
lines changed

3 files changed

+30
-10
lines changed

Zend/tests/dynamic_call_freeing.phpt

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
--TEST--
2+
Freeing of function "name" when dynamic call fails
3+
--FILE--
4+
<?php
5+
6+
try {
7+
$bar = "bar";
8+
("foo" . $bar)();
9+
} catch (Error $e) {
10+
echo $e->getMessage(), "\n";
11+
}
12+
try {
13+
$bar = ["bar"];
14+
(["foo"] + $bar)();
15+
} catch (Error $e) {
16+
echo $e->getMessage(), "\n";
17+
}
18+
try {
19+
(new stdClass)();
20+
} catch (Error $e) {
21+
echo $e->getMessage(), "\n";
22+
}
23+
24+
?>
25+
--EXPECT--
26+
Call to undefined function foobar()
27+
Function name must be a string
28+
Function name must be a string

Zend/zend_vm_def.h

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3816,11 +3816,11 @@ ZEND_VM_C_LABEL(try_function_name):
38163816
call = NULL;
38173817
}
38183818

3819+
FREE_OP2();
38193820
if (UNEXPECTED(!call)) {
38203821
HANDLE_EXCEPTION();
38213822
}
38223823

3823-
FREE_OP2();
38243824
if (OP2_TYPE & (IS_VAR|IS_TMP_VAR)) {
38253825
if (UNEXPECTED(EG(exception))) {
38263826
if (call) {
@@ -3832,8 +3832,6 @@ ZEND_VM_C_LABEL(try_function_name):
38323832
}
38333833
HANDLE_EXCEPTION();
38343834
}
3835-
} else if (UNEXPECTED(!call)) {
3836-
HANDLE_EXCEPTION();
38373835
}
38383836

38393837
call->prev_execute_data = EX(call);

Zend/zend_vm_execute.h

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2951,8 +2951,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_DYNAMIC_CALL_SPEC_CONST_H
29512951
}
29522952
HANDLE_EXCEPTION();
29532953
}
2954-
} else if (UNEXPECTED(!call)) {
2955-
HANDLE_EXCEPTION();
29562954
}
29572955

29582956
call->prev_execute_data = EX(call);
@@ -3107,11 +3105,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_DYNAMIC_CALL_SPEC_TMPVAR_
31073105
call = NULL;
31083106
}
31093107

3108+
zval_ptr_dtor_nogc(free_op2);
31103109
if (UNEXPECTED(!call)) {
31113110
HANDLE_EXCEPTION();
31123111
}
31133112

3114-
zval_ptr_dtor_nogc(free_op2);
31153113
if ((IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_TMP_VAR)) {
31163114
if (UNEXPECTED(EG(exception))) {
31173115
if (call) {
@@ -3123,8 +3121,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_DYNAMIC_CALL_SPEC_TMPVAR_
31233121
}
31243122
HANDLE_EXCEPTION();
31253123
}
3126-
} else if (UNEXPECTED(!call)) {
3127-
HANDLE_EXCEPTION();
31283124
}
31293125

31303126
call->prev_execute_data = EX(call);
@@ -3240,8 +3236,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_DYNAMIC_CALL_SPEC_CV_HAND
32403236
}
32413237
HANDLE_EXCEPTION();
32423238
}
3243-
} else if (UNEXPECTED(!call)) {
3244-
HANDLE_EXCEPTION();
32453239
}
32463240

32473241
call->prev_execute_data = EX(call);

0 commit comments

Comments
 (0)