diff options
author | Xinchen Hui <laruence@gmail.com> | 2018-06-28 12:37:33 +0800 |
---|---|---|
committer | Xinchen Hui <laruence@gmail.com> | 2018-06-28 12:37:33 +0800 |
commit | 1f6b842af430b8cbba0fb1c38a2796ab399171c3 (patch) | |
tree | f22592309d8c1cb1ad50f3900f76f40955a18d73 | |
parent | d1b1866a3a035b946e50b17eeefd19add81c7eab (diff) | |
download | php-git-1f6b842af430b8cbba0fb1c38a2796ab399171c3.tar.gz |
Fixed bug #76536 (PHP crashes with core dump when throwing exception in error handler). (Laruence)
-rw-r--r-- | NEWS | 4 | ||||
-rw-r--r-- | ext/reflection/php_reflection.c | 2 | ||||
-rw-r--r-- | ext/reflection/tests/bug76536.phpt | 20 |
3 files changed, 25 insertions, 1 deletions
@@ -18,6 +18,10 @@ PHP NEWS - phpdbg: . Fix arginfo wrt. optional/required parameters. (cmb) +- Reflection: + . Fixed bug #76536 (PHP crashes with core dump when throwing exception in + error handler). (Laruence) + - Standard: . Fixed bug #76505 (array_merge_recursive() is duplicating sub-array keys). (Laruence) diff --git a/ext/reflection/php_reflection.c b/ext/reflection/php_reflection.c index 7c6e20c07e..95b86e7283 100644 --- a/ext/reflection/php_reflection.c +++ b/ext/reflection/php_reflection.c @@ -4617,7 +4617,7 @@ ZEND_METHOD(reflection_class, getConstants) ZEND_HASH_FOREACH_STR_KEY_PTR(&ce->constants_table, key, c) { if (UNEXPECTED(zval_update_constant_ex(&c->value, ce) != SUCCESS)) { zend_array_destroy(Z_ARRVAL_P(return_value)); - return; + RETURN_NULL(); } val = zend_hash_add_new(Z_ARRVAL_P(return_value), key, &c->value); Z_TRY_ADDREF_P(val); diff --git a/ext/reflection/tests/bug76536.phpt b/ext/reflection/tests/bug76536.phpt new file mode 100644 index 0000000000..9f3b3fdb31 --- /dev/null +++ b/ext/reflection/tests/bug76536.phpt @@ -0,0 +1,20 @@ +--TEST-- +Bug #76536 (PHP crashes with core dump when throwing exception in error handler) +--FILE-- +<?php +class SomeConstants {const SOME_CONSTANT = SOME_NONSENSE;} + +function handleError() {throw new ErrorException();} + +set_error_handler('handleError'); +set_exception_handler('handleError'); + +$r = new \ReflectionClass(SomeConstants::class); +$r->getConstants(); +?> +--EXPECTF-- +Fatal error: Uncaught ErrorException in %sbug76536.php:%d +Stack trace: +#0 [internal function]: handleError(Object(ErrorException)) +#1 {main} + thrown in %sbug76536.php on line %d |