From 409f3b0bd781ca9d841210269cf612f62b4ea1c8 Mon Sep 17 00:00:00 2001 From: Ilija Tovilo Date: Tue, 16 Jul 2024 01:32:22 +0200 Subject: [PATCH] Avoid duplicate code in zend_std_write_property() --- Zend/zend_object_handlers.c | 23 +++-------------------- 1 file changed, 3 insertions(+), 20 deletions(-) diff --git a/Zend/zend_object_handlers.c b/Zend/zend_object_handlers.c index 41e5b83a4da9c..3a49bfd3d8a46 100644 --- a/Zend/zend_object_handlers.c +++ b/Zend/zend_object_handlers.c @@ -961,6 +961,7 @@ ZEND_API zval *zend_std_write_property(zend_object *zobj, zend_string *name, zva goto exit; } +typed_property: ZVAL_COPY_VALUE(&tmp, value); // Increase refcount to prevent object from being released in __toString() GC_ADDREF(zobj); @@ -977,7 +978,7 @@ ZEND_API zval *zend_std_write_property(zend_object *zobj, zend_string *name, zva variable_ptr = &EG(error_zval); goto exit; } - Z_PROP_FLAG_P(variable_ptr) &= ~IS_PROP_REINITABLE; + Z_PROP_FLAG_P(variable_ptr) &= ~(IS_PROP_UNINIT|IS_PROP_REINITABLE); value = &tmp; } @@ -1105,25 +1106,7 @@ found:; variable_ptr = &EG(error_zval); goto exit; } - - ZVAL_COPY_VALUE(&tmp, value); - // Increase refcount to prevent object from being released in __toString() - GC_ADDREF(zobj); - bool type_matched = zend_verify_property_type(prop_info, &tmp, property_uses_strict_types()); - if (UNEXPECTED(GC_DELREF(zobj) == 0)) { - zend_object_released_while_assigning_to_property_error(prop_info); - zend_objects_store_del(zobj); - zval_ptr_dtor(&tmp); - variable_ptr = &EG(error_zval); - goto exit; - } - if (UNEXPECTED(!type_matched)) { - zval_ptr_dtor(value); - goto exit; - } - value = &tmp; - Z_PROP_FLAG_P(variable_ptr) = 0; - goto found; /* might have been updated via e.g. __toString() */ + goto typed_property; } ZVAL_COPY_VALUE(variable_ptr, value);