com php-src: Ensure proper exception handling and EX(opline) state in USER_OPCODE handler: Zend/zend_vm_def.h Zend/ze nd_vm_execute.h
| From: | Bob Weinand | Date: | Thu, 24 Sep 2015 18:33:57 +0000 |
| Subject: | com php-src: Ensure proper exception handling and EX(opline) state in USER_OPCODE handler: Zend/zend_vm_def.h Zend/ze nd_vm_execute.h | ||
| Groups: | php.cvs | ||
| Request: | Send a blank email to php-cvs+get-89165@lists.php.net to get a copy of this message | ||
Commit: 808f62bb4d9812e9b7b35c87f3e90e5fc2bc244b
Author: Bob Weinand <bobwei9@hotmail.com> Thu, 24 Sep 2015 20:33:37 +0200
Parents: 0fd7acd11d4a8cdb6afafabd9eb7eef8385cd067
Branches: PHP-7.0
Link: http://git.php.net/?p=php-src.git;a=commitdiff;h=808f62bb4d9812e9b7b35c87f3e90e5fc2bc244b
Log:
Ensure proper exception handling and EX(opline) state in USER_OPCODE handler
Changed paths:
M Zend/zend_vm_def.h
M Zend/zend_vm_execute.h
Diff:
diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h
index e59337e..daad1c1 100644
--- a/Zend/zend_vm_def.h
+++ b/Zend/zend_vm_def.h
@@ -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);
}
}
diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h
index eeaf279..ea01110 100644
--- a/Zend/zend_vm_execute.h
+++ b/Zend/zend_vm_execute.h
@@ -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);
}
}