]> granicus.if.org Git - php/commitdiff
Fix bug #68262: Broken reference across cloned objects
authorNikita Popov <nikic@php.net>
Sun, 19 Oct 2014 11:21:51 +0000 (13:21 +0200)
committerNikita Popov <nikic@php.net>
Sun, 19 Oct 2014 11:22:44 +0000 (13:22 +0200)
Zend/tests/bug68262.phpt [new file with mode: 0644]
Zend/zend_objects.c

diff --git a/Zend/tests/bug68262.phpt b/Zend/tests/bug68262.phpt
new file mode 100644 (file)
index 0000000..8d009f6
--- /dev/null
@@ -0,0 +1,24 @@
+--TEST--
+Bug #68262: Broken reference across cloned objects
+--FILE--
+<?php
+
+class C {
+    public $p;
+}
+
+$first = new C;
+$first->p = 'init';
+
+$clone = clone $first;
+$ref =& $first->p;
+unset($ref);
+
+$clone = clone $first;
+$clone->p = 'foo';
+
+var_dump($first->p);
+
+?>
+--EXPECT--
+string(4) "init"
index 40d37b3d3616bebd435853fd26bf4a12e673dfed..58c034163e733cad16aabfa4b50c666f0d53de3b 100644 (file)
@@ -144,7 +144,8 @@ ZEND_API void zend_objects_clone_members(zend_object *new_object, zend_object *o
        if (old_object->ce->default_properties_count) {
                for (i = 0; i < old_object->ce->default_properties_count; i++) {
                        zval_ptr_dtor(&new_object->properties_table[i]);
-                       ZVAL_COPY(&new_object->properties_table[i], &old_object->properties_table[i]);
+                       ZVAL_COPY_VALUE(&new_object->properties_table[i], &old_object->properties_table[i]);
+                       zval_add_ref(&new_object->properties_table[i]);
                }
        }
        if (old_object->properties) {