Skip to content

Commit 0a51407

Browse files
committed
ext/reflection: handle virtual+readonly in ReflectionProperty::isWritable().
Follow-up to review feedback from @iluuu1994 on GH-21769. Gate the ZEND_ACC_VIRTUAL branch on prop->hooks being set, and short-circuit virtual properties that also carry ZEND_ACC_READONLY to RETURN_FALSE (no backing slot, treat as always initialized). Covers legitimate virtual+readonly uses outside of DOM.
1 parent 880312b commit 0a51407

File tree

1 file changed

+22
-16
lines changed

1 file changed

+22
-16
lines changed

ext/reflection/php_reflection.c

Lines changed: 22 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -6762,8 +6762,8 @@ ZEND_METHOD(ReflectionProperty, isReadable)
67626762
RETURN_FALSE;
67636763
}
67646764

6765-
if (prop->flags & ZEND_ACC_VIRTUAL) {
6766-
if (prop->hooks && !prop->hooks[ZEND_PROPERTY_HOOK_GET]) {
6765+
if ((prop->flags & ZEND_ACC_VIRTUAL) && prop->hooks) {
6766+
if (!prop->hooks[ZEND_PROPERTY_HOOK_GET]) {
67676767
RETURN_FALSE;
67686768
}
67696769
} else if (obj && (!prop->hooks || !prop->hooks[ZEND_PROPERTY_HOOK_GET])) {
@@ -6853,24 +6853,30 @@ ZEND_METHOD(ReflectionProperty, isWritable)
68536853
RETURN_FALSE;
68546854
}
68556855

6856-
if (prop->flags & ZEND_ACC_VIRTUAL) {
6857-
if (prop->hooks && !prop->hooks[ZEND_PROPERTY_HOOK_SET]) {
6856+
if ((prop->flags & ZEND_ACC_VIRTUAL) && prop->hooks) {
6857+
if (!prop->hooks[ZEND_PROPERTY_HOOK_SET]) {
6858+
RETURN_FALSE;
6859+
}
6860+
} else if (prop->flags & ZEND_ACC_VIRTUAL) {
6861+
if (prop->flags & ZEND_ACC_READONLY) {
68586862
RETURN_FALSE;
68596863
}
6860-
} else if (obj && (prop->flags & ZEND_ACC_READONLY)) {
6864+
} else if ((prop->flags & ZEND_ACC_READONLY)) {
6865+
if (obj) {
68616866
retry:;
6862-
zval *prop_val = OBJ_PROP(obj, prop->offset);
6863-
if (Z_TYPE_P(prop_val) == IS_UNDEF
6864-
&& zend_lazy_object_must_init(obj)
6865-
&& (Z_PROP_FLAG_P(prop_val) & IS_PROP_LAZY)) {
6866-
obj = zend_lazy_object_init(obj);
6867-
if (!obj) {
6868-
RETURN_THROWS();
6867+
zval *prop_val = OBJ_PROP(obj, prop->offset);
6868+
if (Z_TYPE_P(prop_val) == IS_UNDEF
6869+
&& zend_lazy_object_must_init(obj)
6870+
&& (Z_PROP_FLAG_P(prop_val) & IS_PROP_LAZY)) {
6871+
obj = zend_lazy_object_init(obj);
6872+
if (!obj) {
6873+
RETURN_THROWS();
6874+
}
6875+
goto retry;
6876+
}
6877+
if (Z_TYPE_P(prop_val) != IS_UNDEF && !(Z_PROP_FLAG_P(prop_val) & IS_PROP_REINITABLE)) {
6878+
RETURN_FALSE;
68696879
}
6870-
goto retry;
6871-
}
6872-
if (Z_TYPE_P(prop_val) != IS_UNDEF && !(Z_PROP_FLAG_P(prop_val) & IS_PROP_REINITABLE)) {
6873-
RETURN_FALSE;
68746880
}
68756881
}
68766882

0 commit comments

Comments
 (0)