Skip to content

Commit fec19c0

Browse files
committed
Fix exception promition for undef var in frameless calls
1 parent f98e59c commit fec19c0

File tree

5 files changed

+186
-86
lines changed

5 files changed

+186
-86
lines changed
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
--TEST--
2+
Undefined var in frameless call
3+
--FILE--
4+
<?php
5+
set_error_handler(function ($errno, $errstr) {
6+
throw new Exception($errstr);
7+
});
8+
function test() {
9+
strpos($foo, 'o');
10+
}
11+
try {
12+
test();
13+
} catch (Exception $e) {
14+
echo $e->getMessage(), "\n";
15+
}
16+
?>
17+
--EXPECT--
18+
Undefined variable $foo

Zend/zend_vm_def.h

Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -9562,7 +9562,12 @@ ZEND_VM_HANDLER(205, ZEND_FRAMELESS_ICALL_1, CONST|TMP|VAR|CV, UNUSED)
95629562
USE_OPLINE
95639563
SAVE_OPLINE();
95649564
zend_frameless_function_1 function = (zend_frameless_function_1)zend_flf_handlers[opline->extended_value];
9565-
function(EX_VAR(opline->result.var), GET_OP1_ZVAL_PTR_DEREF(BP_VAR_R));
9565+
zval *arg1 = GET_OP1_ZVAL_PTR_DEREF(BP_VAR_R);
9566+
if (EG(exception)) {
9567+
ZVAL_NULL(EX_VAR(opline->result.var));
9568+
HANDLE_EXCEPTION();
9569+
}
9570+
function(EX_VAR(opline->result.var), arg1);
95669571
FREE_OP1();
95679572
if (EG(exception)) {
95689573
ZVAL_NULL(EX_VAR(opline->result.var));
@@ -9576,10 +9581,13 @@ ZEND_VM_HANDLER(206, ZEND_FRAMELESS_ICALL_2, CONST|TMP|VAR|CV, CONST|TMP|VAR|CV)
95769581
USE_OPLINE
95779582
SAVE_OPLINE();
95789583
zend_frameless_function_2 function = (zend_frameless_function_2)zend_flf_handlers[opline->extended_value];
9579-
function(
9580-
EX_VAR(opline->result.var),
9581-
GET_OP1_ZVAL_PTR_DEREF(BP_VAR_R),
9582-
GET_OP2_ZVAL_PTR_DEREF(BP_VAR_R));
9584+
zval *arg1 = GET_OP1_ZVAL_PTR_DEREF(BP_VAR_R);
9585+
zval *arg2 = GET_OP2_ZVAL_PTR_DEREF(BP_VAR_R);
9586+
if (EG(exception)) {
9587+
ZVAL_NULL(EX_VAR(opline->result.var));
9588+
HANDLE_EXCEPTION();
9589+
}
9590+
function(EX_VAR(opline->result.var), arg1, arg2);
95839591
FREE_OP1();
95849592
FREE_OP2();
95859593
if (EG(exception)) {
@@ -9594,11 +9602,14 @@ ZEND_VM_HANDLER(207, ZEND_FRAMELESS_ICALL_3, ANY, ANY)
95949602
USE_OPLINE
95959603
SAVE_OPLINE();
95969604
zend_frameless_function_3 function = (zend_frameless_function_3)zend_flf_handlers[opline->extended_value];
9597-
function(
9598-
EX_VAR(opline->result.var),
9599-
GET_OP1_ZVAL_PTR_DEREF(BP_VAR_R),
9600-
GET_OP2_ZVAL_PTR_DEREF(BP_VAR_R),
9601-
GET_OP_DATA_ZVAL_PTR_DEREF(BP_VAR_R));
9605+
zval *arg1 = GET_OP1_ZVAL_PTR_DEREF(BP_VAR_R);
9606+
zval *arg2 = GET_OP2_ZVAL_PTR_DEREF(BP_VAR_R);
9607+
zval *arg3 = GET_OP_DATA_ZVAL_PTR_DEREF(BP_VAR_R);
9608+
if (EG(exception)) {
9609+
ZVAL_NULL(EX_VAR(opline->result.var));
9610+
HANDLE_EXCEPTION();
9611+
}
9612+
function(EX_VAR(opline->result.var), arg1, arg2, arg3);
96029613
FREE_OP1();
96039614
FREE_OP2();
96049615
FREE_OP_DATA();

0 commit comments

Comments
 (0)