Skip to content

Commit b77cf48

Browse files
committed
Fix throw during exception destruction
1 parent 78c599b commit b77cf48

File tree

3 files changed

+28
-19
lines changed

3 files changed

+28
-19
lines changed

Zend/tests/try/catch_novar_2.phpt

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,5 +15,12 @@ try {
1515
}
1616
echo "Unreachable fallthrough\n";
1717

18-
--EXPECT--
18+
?>
19+
--EXPECTF--
1920
Throwing
21+
22+
Fatal error: Uncaught RuntimeException: ThrowsOnDestruct::__destruct in %s:%d
23+
Stack trace:
24+
#0 %s(%d): ThrowsOnDestruct->__destruct()
25+
#1 {main}
26+
thrown in %s on line %d

Zend/zend_vm_def.h

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4453,7 +4453,6 @@ ZEND_VM_HANDLER(107, ZEND_CATCH, CONST, JMP_ADDR, LAST_CATCH|CACHE_SLOT)
44534453
USE_OPLINE
44544454
zend_class_entry *ce, *catch_ce;
44554455
zend_object *exception;
4456-
zval *ex;
44574456

44584457
SAVE_OPLINE();
44594458
/* Check whether an exception has been thrown, if not, jump over code */
@@ -4487,21 +4486,23 @@ ZEND_VM_HANDLER(107, ZEND_CATCH, CONST, JMP_ADDR, LAST_CATCH|CACHE_SLOT)
44874486

44884487
exception = EG(exception);
44894488
if (RETURN_VALUE_USED(opline)) {
4490-
ex = EX_VAR(opline->result.var);
4489+
zval *ex = EX_VAR(opline->result.var);
44914490
if (UNEXPECTED(Z_ISREF_P(ex))) {
44924491
ex = Z_REFVAL_P(ex);
44934492
}
44944493
zval_ptr_dtor(ex);
44954494
ZVAL_OBJ(ex, EG(exception));
4496-
} else {
4497-
OBJ_RELEASE(EG(exception));
4498-
}
4499-
if (UNEXPECTED(EG(exception) != exception)) {
4500-
ZVAL_UNDEF(ex);
4501-
HANDLE_EXCEPTION();
4495+
if (UNEXPECTED(EG(exception) != exception)) {
4496+
ZVAL_UNDEF(ex);
4497+
HANDLE_EXCEPTION();
4498+
} else {
4499+
EG(exception) = NULL;
4500+
ZEND_VM_NEXT_OPCODE();
4501+
}
45024502
} else {
45034503
EG(exception) = NULL;
4504-
ZEND_VM_NEXT_OPCODE();
4504+
OBJ_RELEASE(exception);
4505+
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
45054506
}
45064507
}
45074508

Zend/zend_vm_execute.h

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3669,7 +3669,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CATCH_SPEC_CONST_HANDLER(ZEND_
36693669
USE_OPLINE
36703670
zend_class_entry *ce, *catch_ce;
36713671
zend_object *exception;
3672-
zval *ex;
36733672

36743673
SAVE_OPLINE();
36753674
/* Check whether an exception has been thrown, if not, jump over code */
@@ -3703,21 +3702,23 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CATCH_SPEC_CONST_HANDLER(ZEND_
37033702

37043703
exception = EG(exception);
37053704
if (RETURN_VALUE_USED(opline)) {
3706-
ex = EX_VAR(opline->result.var);
3705+
zval *ex = EX_VAR(opline->result.var);
37073706
if (UNEXPECTED(Z_ISREF_P(ex))) {
37083707
ex = Z_REFVAL_P(ex);
37093708
}
37103709
zval_ptr_dtor(ex);
37113710
ZVAL_OBJ(ex, EG(exception));
3712-
} else {
3713-
OBJ_RELEASE(EG(exception));
3714-
}
3715-
if (UNEXPECTED(EG(exception) != exception)) {
3716-
ZVAL_UNDEF(ex);
3717-
HANDLE_EXCEPTION();
3711+
if (UNEXPECTED(EG(exception) != exception)) {
3712+
ZVAL_UNDEF(ex);
3713+
HANDLE_EXCEPTION();
3714+
} else {
3715+
EG(exception) = NULL;
3716+
ZEND_VM_NEXT_OPCODE();
3717+
}
37183718
} else {
37193719
EG(exception) = NULL;
3720-
ZEND_VM_NEXT_OPCODE();
3720+
OBJ_RELEASE(exception);
3721+
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
37213722
}
37223723
}
37233724

0 commit comments

Comments
 (0)