Skip to content

Commit 808f62b

Browse files
committed
Ensure proper exception handling and EX(opline) state in USER_OPCODE handler
1 parent 0fd7acd commit 808f62b

File tree

2 files changed

+14
-2
lines changed

2 files changed

+14
-2
lines changed

Zend/zend_vm_def.h

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7176,10 +7176,14 @@ ZEND_VM_HANDLER(150, ZEND_USER_OPCODE, ANY, ANY)
71767176

71777177
SAVE_OPLINE();
71787178
ret = zend_user_opcode_handlers[opline->opcode](execute_data);
7179-
LOAD_OPLINE();
7179+
7180+
if (EG(exception)) {
7181+
HANDLE_EXCEPTION();
7182+
}
71807183

71817184
switch (ret) {
71827185
case ZEND_USER_OPCODE_CONTINUE:
7186+
LOAD_OPLINE();
71837187
ZEND_VM_CONTINUE();
71847188
case ZEND_USER_OPCODE_RETURN:
71857189
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)
71947198
case ZEND_USER_OPCODE_LEAVE:
71957199
ZEND_VM_LEAVE();
71967200
case ZEND_USER_OPCODE_DISPATCH:
7201+
ZEND_ASSERT(EX(opline) == opline);
71977202
ZEND_VM_DISPATCH(opline->opcode, opline);
71987203
default:
7204+
ZEND_ASSERT(EX(opline) == opline);
71997205
ZEND_VM_DISPATCH((zend_uchar)(ret & 0xff), opline);
72007206
}
72017207
}

Zend/zend_vm_execute.h

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1563,10 +1563,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_USER_OPCODE_SPEC_HANDLER(ZEND_
15631563

15641564
SAVE_OPLINE();
15651565
ret = zend_user_opcode_handlers[opline->opcode](execute_data);
1566-
LOAD_OPLINE();
1566+
1567+
if (EG(exception)) {
1568+
HANDLE_EXCEPTION();
1569+
}
15671570

15681571
switch (ret) {
15691572
case ZEND_USER_OPCODE_CONTINUE:
1573+
LOAD_OPLINE();
15701574
ZEND_VM_CONTINUE();
15711575
case ZEND_USER_OPCODE_RETURN:
15721576
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_
15811585
case ZEND_USER_OPCODE_LEAVE:
15821586
ZEND_VM_LEAVE();
15831587
case ZEND_USER_OPCODE_DISPATCH:
1588+
ZEND_ASSERT(EX(opline) == opline);
15841589
ZEND_VM_DISPATCH(opline->opcode, opline);
15851590
default:
1591+
ZEND_ASSERT(EX(opline) == opline);
15861592
ZEND_VM_DISPATCH((zend_uchar)(ret & 0xff), opline);
15871593
}
15881594
}

0 commit comments

Comments
 (0)