]> granicus.if.org Git - php/commitdiff
Fix FE_FETCH_* exception check
authorNikita Popov <nikita.ppv@gmail.com>
Sun, 25 Jun 2017 14:45:17 +0000 (16:45 +0200)
committerNikita Popov <nikita.ppv@gmail.com>
Sun, 25 Jun 2017 14:45:17 +0000 (16:45 +0200)
Only applying this for 7.2, because handling this would be ugly
under the old retval freeing semantics.

Zend/tests/fe_fetch_dtor_exception.phpt [new file with mode: 0644]
Zend/zend_vm_def.h
Zend/zend_vm_execute.h

diff --git a/Zend/tests/fe_fetch_dtor_exception.phpt b/Zend/tests/fe_fetch_dtor_exception.phpt
new file mode 100644 (file)
index 0000000..840544b
--- /dev/null
@@ -0,0 +1,22 @@
+--TEST--
+Dtor may throw exception furing FE_FETCH assignment
+--FILE--
+<?php
+
+$v = new class {
+    function __destruct() {
+        throw new Exception("foo");
+    }
+};
+
+try {
+    foreach ([1, 2] as $v) {
+        var_dump($v);
+    }
+} catch (Exception $e) {
+    echo $e->getMessage(), "\n";
+}
+
+?>
+--EXPECT--
+foo
index e3eb3370384e0d8b827a7e1b4c466ac88e36311e..3839a720790bf825e7ea838acc6ed2848d36dd7f 100644 (file)
@@ -5954,7 +5954,7 @@ ZEND_VM_C_LABEL(fe_fetch_r_exit):
                        GC_REFCOUNT(gc)++;
                }
        }
-       ZEND_VM_NEXT_OPCODE();
+       ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
 }
 
 ZEND_VM_HANDLER(126, ZEND_FE_FETCH_RW, VAR, ANY, JMP_ADDR)
@@ -6128,7 +6128,7 @@ ZEND_VM_C_LABEL(fe_fetch_w_exit):
                Z_ADDREF_P(value);
                ZVAL_REF(EX_VAR(opline->op2.var), Z_REF_P(value));
        }
-       ZEND_VM_NEXT_OPCODE();
+       ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
 }
 
 ZEND_VM_HANDLER(114, ZEND_ISSET_ISEMPTY_VAR, CONST|TMPVAR|CV, UNUSED, VAR_FETCH|ISSET)
@@ -8803,7 +8803,7 @@ ZEND_VM_HOT_TYPE_SPEC_HANDLER(ZEND_FE_FETCH_R, op->op2_type == IS_CV && (op1_inf
 
        variable_ptr = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op2.var EXECUTE_DATA_CC);
        zend_assign_to_variable(variable_ptr, value, IS_CV);
-       ZEND_VM_NEXT_OPCODE();
+       ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
 }
 
 ZEND_VM_DEFINE_OP(137, ZEND_OP_DATA);
index 7f43c0dfbf6dcf9a49b027245f063a5453acb8f4..35a0dfdbafb9ec9ce74b8a837891149610215d2c 100644 (file)
@@ -16872,7 +16872,7 @@ fe_fetch_r_exit:
                        GC_REFCOUNT(gc)++;
                }
        }
-       ZEND_VM_NEXT_OPCODE();
+       ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
 }
 
 static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_FETCH_RW_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
@@ -17046,7 +17046,7 @@ fe_fetch_w_exit:
                Z_ADDREF_P(value);
                ZVAL_REF(EX_VAR(opline->op2.var), Z_REF_P(value));
        }
-       ZEND_VM_NEXT_OPCODE();
+       ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
 }
 
 static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMP_SET_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
@@ -24261,7 +24261,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_FETCH_R_SIMPLE_
 
        variable_ptr = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op2.var EXECUTE_DATA_CC);
        zend_assign_to_variable(variable_ptr, value, IS_CV);
-       ZEND_VM_NEXT_OPCODE();
+       ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
 }
 
 
@@ -24313,7 +24313,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_FETCH_R_SIMPLE_
 
        variable_ptr = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op2.var EXECUTE_DATA_CC);
        zend_assign_to_variable(variable_ptr, value, IS_CV);
-       ZEND_VM_NEXT_OPCODE();
+       ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
 }