]> granicus.if.org Git - php/commitdiff
Ensure proper exception handling and EX(opline) state in USER_OPCODE handler
authorBob Weinand <bobwei9@hotmail.com>
Thu, 24 Sep 2015 18:33:37 +0000 (20:33 +0200)
committerBob Weinand <bobwei9@hotmail.com>
Thu, 24 Sep 2015 18:33:57 +0000 (20:33 +0200)
Zend/zend_vm_def.h
Zend/zend_vm_execute.h

index e59337ec73ce407483baa34f8e1c2aabebff8a44..daad1c120d4351161f3142512733a12fb8aa8dcc 100644 (file)
@@ -7176,10 +7176,14 @@ ZEND_VM_HANDLER(150, ZEND_USER_OPCODE, ANY, ANY)
 
        SAVE_OPLINE();
        ret = zend_user_opcode_handlers[opline->opcode](execute_data);
-       LOAD_OPLINE();
+
+       if (EG(exception)) {
+               HANDLE_EXCEPTION();
+       }
 
        switch (ret) {
                case ZEND_USER_OPCODE_CONTINUE:
+                       LOAD_OPLINE();
                        ZEND_VM_CONTINUE();
                case ZEND_USER_OPCODE_RETURN:
                        if (UNEXPECTED((EX(func)->op_array.fn_flags & ZEND_ACC_GENERATOR) != 0)) {
@@ -7194,8 +7198,10 @@ ZEND_VM_HANDLER(150, ZEND_USER_OPCODE, ANY, ANY)
                case ZEND_USER_OPCODE_LEAVE:
                        ZEND_VM_LEAVE();
                case ZEND_USER_OPCODE_DISPATCH:
+                       ZEND_ASSERT(EX(opline) == opline);
                        ZEND_VM_DISPATCH(opline->opcode, opline);
                default:
+                       ZEND_ASSERT(EX(opline) == opline);
                        ZEND_VM_DISPATCH((zend_uchar)(ret & 0xff), opline);
        }
 }
index eeaf27930d013bdd6d8d1c44c60a718bbafbdbd2..ea01110d9615f634b904b78e6dc4f09cac4bced7 100644 (file)
@@ -1563,10 +1563,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_USER_OPCODE_SPEC_HANDLER(ZEND_
 
        SAVE_OPLINE();
        ret = zend_user_opcode_handlers[opline->opcode](execute_data);
-       LOAD_OPLINE();
+
+       if (EG(exception)) {
+               HANDLE_EXCEPTION();
+       }
 
        switch (ret) {
                case ZEND_USER_OPCODE_CONTINUE:
+                       LOAD_OPLINE();
                        ZEND_VM_CONTINUE();
                case ZEND_USER_OPCODE_RETURN:
                        if (UNEXPECTED((EX(func)->op_array.fn_flags & ZEND_ACC_GENERATOR) != 0)) {
@@ -1581,8 +1585,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_USER_OPCODE_SPEC_HANDLER(ZEND_
                case ZEND_USER_OPCODE_LEAVE:
                        ZEND_VM_LEAVE();
                case ZEND_USER_OPCODE_DISPATCH:
+                       ZEND_ASSERT(EX(opline) == opline);
                        ZEND_VM_DISPATCH(opline->opcode, opline);
                default:
+                       ZEND_ASSERT(EX(opline) == opline);
                        ZEND_VM_DISPATCH((zend_uchar)(ret & 0xff), opline);
        }
 }