- Fixed bug #50383 (Exceptions thrown in __call / __callStatic do not include
file and line in trace). (Felipe)
- Fixed bug #50358 (Compile failure compiling ext/phar/util.lo). (Felipe)
+- Fixed bug #49893 (Crash while creating an instance of Zend_Mail_Storage_Pop3).
+ (Dmitry)
- Fixed bug #49778 (DateInterval::format("%a") is always zero when an interval
is created from an ISO string). (Derick)
- Fixed bug #49700 (memory leaks in php_date.c if garbage collector is
--- /dev/null
+--TEST--
+Bug #49893 (Crash while creating an instance of Zend_Mail_Storage_Pop3)
+--FILE--
+<?php
+class A {
+ function __destruct() {
+ try {
+ throw new Exception("2");
+ } catch (Exception $e) {
+ echo $e->getMessage() . "\n";
+ }
+ }
+}
+class B {
+ function __construct() {
+ $this->a = new A();
+ throw new Exception("1");
+ }
+}
+try {
+ $b = new B();
+} catch(Exception $e) {
+ echo $e->getMessage() . "\n";;
+}
+?>
+--EXPECT--
+2
+1
zend_function *destructor = object ? object->ce->destructor : NULL;
if (destructor) {
+ zval *old_exception;
zval *obj;
zend_object_store_bucket *obj_bucket;
* For example, if an exception was thrown in a function and when the function's
* local variable destruction results in a destructor being called.
*/
- if (EG(exception) && Z_OBJ_HANDLE_P(EG(exception)) == handle) {
- zend_error(E_ERROR, "Attempt to destruct pending exception");
+ old_exception = NULL;
+ if (EG(exception)) {
+ if (Z_OBJ_HANDLE_P(EG(exception)) == handle) {
+ zend_error(E_ERROR, "Attempt to destruct pending exception");
+ } else {
+ old_exception = EG(exception);
+ Z_ADDREF_P(old_exception);
+ }
}
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);
+ } else {
+ EG(exception) = old_exception;
+ }
+ }
zval_ptr_dtor(&obj);
}
}