diff --git a/ext/reflection/php_reflection.c b/ext/reflection/php_reflection.c index e74b7fcb27a7..860b4049a2fb 100644 --- a/ext/reflection/php_reflection.c +++ b/ext/reflection/php_reflection.c @@ -6763,8 +6763,7 @@ ZEND_METHOD(ReflectionProperty, isReadable) } if (prop->flags & ZEND_ACC_VIRTUAL) { - ZEND_ASSERT(prop->hooks); - if (!prop->hooks[ZEND_PROPERTY_HOOK_GET]) { + if (prop->hooks && !prop->hooks[ZEND_PROPERTY_HOOK_GET]) { RETURN_FALSE; } } else if (obj && (!prop->hooks || !prop->hooks[ZEND_PROPERTY_HOOK_GET])) { @@ -6855,8 +6854,7 @@ ZEND_METHOD(ReflectionProperty, isWritable) } if (prop->flags & ZEND_ACC_VIRTUAL) { - ZEND_ASSERT(prop->hooks); - if (!prop->hooks[ZEND_PROPERTY_HOOK_SET]) { + if (prop->hooks && !prop->hooks[ZEND_PROPERTY_HOOK_SET]) { RETURN_FALSE; } } else if (obj && (prop->flags & ZEND_ACC_READONLY)) { diff --git a/ext/reflection/tests/gh21768.phpt b/ext/reflection/tests/gh21768.phpt new file mode 100644 index 000000000000..422239120dbe --- /dev/null +++ b/ext/reflection/tests/gh21768.phpt @@ -0,0 +1,21 @@ +--TEST-- +GH-21768: Assertion failure in ReflectionProperty::is{Readable,Writable}() on internal virtual properties +--EXTENSIONS-- +dom +--FILE-- +getProperties() as $rp) { + if (!$rp->isVirtual()) + continue; + if (!$rp->isReadable(null)) + die("$rp should be readable"); + if (!$rp->isWritable(null)) + die("$rp should be writable"); +} +echo "done\n"; + +?> +--EXPECT-- +done