Skip to content

Commit b1f2b5c

Browse files
committed
Unlock readonly properties after __clone() for clone-with
1 parent 879b7be commit b1f2b5c

File tree

2 files changed

+14
-1
lines changed

2 files changed

+14
-1
lines changed

Zend/tests/clone/clone_with_008.phpt

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,4 +32,9 @@ object(Clazz)#%d (2) {
3232
["b"]=>
3333
string(7) "__clone"
3434
}
35-
Error: Cannot modify readonly property Clazz::$b
35+
object(Clazz)#%d (2) {
36+
["a"]=>
37+
string(7) "default"
38+
["b"]=>
39+
string(4) "with"
40+
}

Zend/zend_objects.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -294,6 +294,14 @@ ZEND_API void ZEND_FASTCALL zend_objects_clone_members_ex(zend_object *new_objec
294294
}
295295

296296
if (EXPECTED(!EG(exception)) && properties != NULL) {
297+
/* Unlock readonly properties once more. */
298+
if (ZEND_CLASS_HAS_READONLY_PROPS(new_object->ce) && old_object->ce->clone) {
299+
for (uint32_t i = 0; i < new_object->ce->default_properties_count; i++) {
300+
zval* prop = OBJ_PROP_NUM(new_object, i);
301+
Z_PROP_FLAG_P(prop) |= IS_PROP_REINITABLE;
302+
}
303+
}
304+
297305
zend_class_entry *old_scope = EG(fake_scope);
298306

299307
EG(fake_scope) = scope;

0 commit comments

Comments
 (0)