]> granicus.if.org Git - php/commitdiff
Don't double initialize object properties
authorNikita Popov <nikita.ppv@gmail.com>
Tue, 2 May 2017 20:16:41 +0000 (22:16 +0200)
committerNikita Popov <nikita.ppv@gmail.com>
Thu, 4 May 2017 18:57:21 +0000 (20:57 +0200)
Zend/zend_objects.c

index 9b5a2c74fd1e6276dfa13d318676215bf8d45d2e..900ec1db5bb15f77a90b92d9acbc140f91ef075f 100644 (file)
@@ -36,17 +36,9 @@ ZEND_API void zend_object_std_init(zend_object *object, zend_class_entry *ce)
        object->ce = ce;
        object->properties = NULL;
        zend_objects_store_put(object);
-       p = object->properties_table;
-       if (EXPECTED(ce->default_properties_count != 0)) {
-               end = p + ce->default_properties_count;
-               do {
-                       ZVAL_UNDEF(p);
-                       p++;
-               } while (p != end);
-       }
        if (UNEXPECTED(ce->ce_flags & ZEND_ACC_USE_GUARDS)) {
                GC_FLAGS(object) |= IS_OBJ_USE_GUARDS;
-               ZVAL_UNDEF(p);
+               ZVAL_UNDEF(object->properties_table + object->ce->default_properties_count);
        }
 }
 
@@ -252,6 +244,16 @@ ZEND_API zend_object *zend_objects_clone_obj(zval *zobject)
        old_object = Z_OBJ_P(zobject);
        new_object = zend_objects_new(old_object->ce);
 
+       /* zend_objects_clone_members() expect the properties to be initialized. */
+       if (new_object->ce->default_properties_count) {
+               zval *p = new_object->properties_table;
+               zval *end = p + new_object->ce->default_properties_count;
+               do {
+                       ZVAL_UNDEF(p);
+                       p++;
+               } while (p != end);
+       }
+
        zend_objects_clone_members(new_object, old_object);
 
        return new_object;