From: Dmitry Stogov Date: Thu, 26 Mar 2009 10:56:25 +0000 (+0000) Subject: Fixed bug #47714 (autoloading classes inside exception_handler leads to crashes) X-Git-Tag: php-5.4.0alpha1~191^2~4052 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=f1a231d2e62ffb057eacbbf9bd9a0c3ea6a54867;p=php Fixed bug #47714 (autoloading classes inside exception_handler leads to crashes) --- diff --git a/Zend/tests/bug47714.phpt b/Zend/tests/bug47714.phpt new file mode 100644 index 0000000000..c784f8fb93 --- /dev/null +++ b/Zend/tests/bug47714.phpt @@ -0,0 +1,26 @@ +--TEST-- +--FILE-- +getMessage()."\n"; + } + }'); +} + +function __autoload($class) { + au($class); +} + +//spl_autoload_register('au'); + +set_exception_handler(function($exception) { + $h = new handler(); + $h->handle($exception); +}); + +throw new Exception('exception'); +?> +--EXPECT-- +exception diff --git a/Zend/zend.c b/Zend/zend.c index 989e2a6d59..ac68702d70 100644 --- a/Zend/zend.c +++ b/Zend/zend.c @@ -1781,20 +1781,20 @@ ZEND_API int zend_execute_scripts(int type TSRMLS_DC, zval **retval, int file_co zval *orig_user_exception_handler; zval **params[1], *retval2, *old_exception; old_exception = EG(exception); - zend_exception_save(TSRMLS_C); + EG(exception) = NULL; params[0] = &old_exception; orig_user_exception_handler = EG(user_exception_handler); if (call_user_function_ex(CG(function_table), NULL, orig_user_exception_handler, &retval2, 1, params, 1, NULL TSRMLS_CC) == SUCCESS) { if (retval2 != NULL) { zval_ptr_dtor(&retval2); } - zend_exception_restore(TSRMLS_C); if (EG(exception)) { zval_ptr_dtor(&EG(exception)); EG(exception) = NULL; } + zval_ptr_dtor(&old_exception); } else { - zend_exception_restore(TSRMLS_C); + EG(exception) = old_exception; zend_exception_error(EG(exception), E_ERROR TSRMLS_CC); } } else {