diff options
-rw-r--r-- | ext/reflection/php_reflection.c | 2 | ||||
-rw-r--r-- | ext/reflection/tests/bug76536.phpt | 20 |
2 files changed, 21 insertions, 1 deletions
diff --git a/ext/reflection/php_reflection.c b/ext/reflection/php_reflection.c index 991f0da341..9128f76d9d 100644 --- a/ext/reflection/php_reflection.c +++ b/ext/reflection/php_reflection.c @@ -4496,7 +4496,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 |