Skip to content

Commit 189f625

Browse files
committed
Fix freeing of dynamic call name
We need to free op2 if the call construction fails. Also remove a redundant check for !call.
1 parent 3d50131 commit 189f625

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
@@ -3344,11 +3344,11 @@ ZEND_VM_C_LABEL(try_function_name):
33443344
call = NULL;
33453345
}
33463346

3347+
FREE_OP2();
33473348
if (UNEXPECTED(!call)) {
33483349
HANDLE_EXCEPTION();
33493350
}
33503351

3351-
FREE_OP2();
33523352
if (OP2_TYPE & (IS_VAR|IS_TMP_VAR)) {
33533353
if (UNEXPECTED(EG(exception))) {
33543354
if (call) {
@@ -3360,8 +3360,6 @@ ZEND_VM_C_LABEL(try_function_name):
33603360
}
33613361
HANDLE_EXCEPTION();
33623362
}
3363-
} else if (UNEXPECTED(!call)) {
3364-
HANDLE_EXCEPTION();
33653363
}
33663364

33673365
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
@@ -2137,8 +2137,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_DYNAMIC_CALL_SPEC_CONST_H
21372137
}
21382138
HANDLE_EXCEPTION();
21392139
}
2140-
} else if (UNEXPECTED(!call)) {
2141-
HANDLE_EXCEPTION();
21422140
}
21432141

21442142
call->prev_execute_data = EX(call);
@@ -2313,11 +2311,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_DYNAMIC_CALL_SPEC_TMPVAR_
23132311
call = NULL;
23142312
}
23152313

2314+
zval_ptr_dtor_nogc(free_op2);
23162315
if (UNEXPECTED(!call)) {
23172316
HANDLE_EXCEPTION();
23182317
}
23192318

2320-
zval_ptr_dtor_nogc(free_op2);
23212319
if ((IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_TMP_VAR)) {
23222320
if (UNEXPECTED(EG(exception))) {
23232321
if (call) {
@@ -2329,8 +2327,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_DYNAMIC_CALL_SPEC_TMPVAR_
23292327
}
23302328
HANDLE_EXCEPTION();
23312329
}
2332-
} else if (UNEXPECTED(!call)) {
2333-
HANDLE_EXCEPTION();
23342330
}
23352331

23362332
call->prev_execute_data = EX(call);
@@ -2446,8 +2442,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_DYNAMIC_CALL_SPEC_CV_HAND
24462442
}
24472443
HANDLE_EXCEPTION();
24482444
}
2449-
} else if (UNEXPECTED(!call)) {
2450-
HANDLE_EXCEPTION();
24512445
}
24522446

24532447
call->prev_execute_data = EX(call);

0 commit comments

Comments
 (0)