Browse Source

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

pull/12/head
Dmitry Stogov 16 years ago
parent
commit
7ca414f5e7
  1. 2
      NEWS
  2. 35
      Zend/tests/bug52361.phpt
  3. 6
      Zend/zend_objects.c

2
NEWS

@ -24,6 +24,8 @@
(Andrey)
- Fixed bug #52413 (MySQLi/libmysql build failure on OS X, FreeBSD). (Andrey)
- Fixed bug #52390 (mysqli_report() should be per-request setting). (Kalle)
- Fixed bug #52361 (Throwing an exception in a destructor causes invalid
catching). (Dmitry)
- Fixed bug #52302 (mysqli_fetch_all does not work with MYSQLI_USE_RESULT).
(Andrey)
- Fixed bug #51610 (Using oci_connect causes PHP to take a long time to

35
Zend/tests/bug52361.phpt

@ -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}

6
Zend/zend_objects.c

@ -106,15 +106,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;
}

Loading…
Cancel
Save