Bug #52361 (Throwing an exception in a destructor causes invalid catching)

This commit is contained in:
Dmitry Stogov 2010-08-16 09:20:46 +00:00
parent e461c22ea9
commit d93cf2a2d0
2 changed files with 37 additions and 4 deletions

35
Zend/tests/bug52361.phpt Normal file
View File

@ -0,0 +1,35 @@
--TEST--
Bug #52361 (Throwing an exception in a destructor causes invalid catching)
--FILE--
<?php
class aaa {
public function __destruct() {
try {
throw new Exception(__CLASS__);
} catch(Exception $ex) {
echo "1. $ex\n";
}
}
}
function bbb() {
$a = new aaa();
throw new Exception(__FUNCTION__);
}
try {
bbb();
echo "must be skipped !!!";
} catch(Exception $ex) {
echo "2. $ex\n";
}
?>
--EXPECTF--
1. exception 'Exception' with message 'aaa' in %sbug52361.php:5
Stack trace:
#0 %sbug52361.php(16): aaa->__destruct()
#1 %sbug52361.php(16): bbb()
#2 {main}
2. exception 'Exception' with message 'bbb' in %sbug52361.php:13
Stack trace:
#0 %sbug52361.php(16): bbb()
#1 {main}

View File

@ -117,15 +117,13 @@ ZEND_API void zend_objects_destroy_object(zend_object *object, zend_object_handl
zend_error(E_ERROR, "Attempt to destruct pending exception");
} else {
old_exception = EG(exception);
Z_ADDREF_P(old_exception);
EG(exception) = NULL;
}
}
zend_exception_save(TSRMLS_C);
zend_call_method_with_0_params(&obj, object->ce, &destructor, ZEND_DESTRUCTOR_FUNC_NAME, NULL);
zend_exception_restore(TSRMLS_C);
if (old_exception) {
if (EG(exception)) {
zval_ptr_dtor(&old_exception);
zend_exception_set_previous(EG(exception), old_exception TSRMLS_CC);
} else {
EG(exception) = old_exception;
}