diff options
author | Nikita Popov <nikita.ppv@gmail.com> | 2020-08-31 14:49:16 +0200 |
---|---|---|
committer | Nikita Popov <nikita.ppv@gmail.com> | 2020-08-31 14:50:20 +0200 |
commit | 8bb2f406def958671e7719966a4c015dfe1e448b (patch) | |
tree | 6fffd08bd82aa5528377d242780b0b1072fc2484 /ext/reflection | |
parent | 41e11a8e715b2a9251a4cc088fde6637cd3c9fd4 (diff) | |
download | php-git-8bb2f406def958671e7719966a4c015dfe1e448b.tar.gz |
Check update constant failure in ReflectionClassConstant::__toString()
Diffstat (limited to 'ext/reflection')
-rw-r--r-- | ext/reflection/php_reflection.c | 5 | ||||
-rw-r--r-- | ext/reflection/tests/ReflectionClassConstant_toString_error.phpt | 18 |
2 files changed, 22 insertions, 1 deletions
diff --git a/ext/reflection/php_reflection.c b/ext/reflection/php_reflection.c index f62dd15e1c..df00e5b4ba 100644 --- a/ext/reflection/php_reflection.c +++ b/ext/reflection/php_reflection.c @@ -547,7 +547,10 @@ static void _class_const_string(smart_str *str, char *name, zend_class_constant char *visibility = zend_visibility_string(Z_ACCESS_FLAGS(c->value)); char *type; - zval_update_constant_ex(&c->value, c->ce); + if (zval_update_constant_ex(&c->value, c->ce) == FAILURE) { + return; + } + type = zend_zval_type_name(&c->value); if (Z_TYPE(c->value) == IS_ARRAY) { diff --git a/ext/reflection/tests/ReflectionClassConstant_toString_error.phpt b/ext/reflection/tests/ReflectionClassConstant_toString_error.phpt new file mode 100644 index 0000000000..cd4dfa3765 --- /dev/null +++ b/ext/reflection/tests/ReflectionClassConstant_toString_error.phpt @@ -0,0 +1,18 @@ +--TEST-- +Exception thrown while converting ReflectionClassConstant to string +--FILE-- +<?php + +class B { + const X = self::UNKNOWN; +} + +try { + echo new ReflectionClassConstant('B', 'X'); +} catch (Error $e) { + echo $e->getMessage(), "\n"; +} + +?> +--EXPECT-- +Undefined class constant 'self::UNKNOWN' |