]> granicus.if.org Git - php/commitdiff
Fixed bug #34767 (Zend Engine 1 Compatibility not copying objects correctly)
authorDmitry Stogov <dmitry@php.net>
Thu, 20 Oct 2005 08:14:59 +0000 (08:14 +0000)
committerDmitry Stogov <dmitry@php.net>
Thu, 20 Oct 2005 08:14:59 +0000 (08:14 +0000)
NEWS
Zend/tests/bug34767.phpt [new file with mode: 0755]
Zend/zend_execute_API.c

diff --git a/NEWS b/NEWS
index 18f023ed8e174a87b3379c128e10449bde71a109..3a54ef5ce443ade3f0a135b6de8b4a21d6688fd6 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -4,6 +4,8 @@ PHP                                                                        NEWS
 - Fixed bug #34905 (Digest authentication does not work with Apache 1). (Ilia)
 - Fixed bug #34902 (mysqli::character_set_name() - undefined method). (Tony)
 - Fixed bug #34899 (Fixed sqlite extension compile failure). (Ilia)
+- Fixed bug #34767 (Zend Engine 1 Compatibility not copying objects correctly).
+  (Dmitry)
 - Fixed bug #33829 (mime_content_type() returns text/plain for gzip and bzip 
   files). (Derick)
 - Fixed bug #34623 (Crash in pdo_mysql on longtext fields). (Ilia)
diff --git a/Zend/tests/bug34767.phpt b/Zend/tests/bug34767.phpt
new file mode 100755 (executable)
index 0000000..45af9f9
--- /dev/null
@@ -0,0 +1,33 @@
+--TEST--
+Bug #34767 (Zend Engine 1 Compatibility not copying objects correctly)
+--INI--
+zend.ze1_compatibility_mode=1
+error_reporting=4095
+--FILE--
+<?php
+$a->y = &new stdClass();
+print_r($a);
+$b = $a;
+$a->y->z = 1;
+print_r($b);
+?>
+--EXPECTF--
+
+Strict Standards: Assigning the return value of new by reference is deprecated in %sbug34767.php on line 2
+stdClass Object
+(
+    [y] => stdClass Object
+        (
+        )
+
+)
+
+Strict Standards: Implicit cloning object of class 'stdClass' because of 'zend.ze1_compatibility_mode' in %sbug34767.php on line 4
+stdClass Object
+(
+    [y] => stdClass Object
+        (
+            [z] => 1
+        )
+
+)
index 9022ee0de34eb05cb0d108d3046844fd5816f770..c745e6579837c6c905f97020ea36f64fafe6b85f 100644 (file)
@@ -386,6 +386,13 @@ ZEND_API void _zval_ptr_dtor(zval **zval_ptr ZEND_FILE_LINE_DC)
                zval_dtor(*zval_ptr);
                safe_free_zval_ptr_rel(*zval_ptr ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_CC);
        } else if ((*zval_ptr)->refcount == 1) {
+               if ((*zval_ptr)->type == IS_OBJECT) {
+                       TSRMLS_FETCH();
+
+                       if (EG(ze1_compatibility_mode)) {
+                               return;
+                       }
+               }
                (*zval_ptr)->is_ref = 0;
        }
 }