]> granicus.if.org Git - php/commitdiff
such a weird hack probably helps in finding regressions in the future
authorMichael Wallner <mike@php.net>
Fri, 4 Oct 2013 14:11:49 +0000 (16:11 +0200)
committerMichael Wallner <mike@php.net>
Fri, 4 Oct 2013 14:11:49 +0000 (16:11 +0200)
ext/standard/tests/serialize/bug65806.phpt [new file with mode: 0644]

diff --git a/ext/standard/tests/serialize/bug65806.phpt b/ext/standard/tests/serialize/bug65806.phpt
new file mode 100644 (file)
index 0000000..19fab95
--- /dev/null
@@ -0,0 +1,83 @@
+--TEST--
+Bug #65806 (unserialize fails with object which is referenced multiple times)
+--FILE--
+<?php
+class myObjA {}
+class myObjB {
+    public $attrA;
+    public $attrB;
+}
+class myObjC {
+    public $attrC;
+    public $attrD;
+}
+class myList {
+    private $_serialized;
+    private $_obj;
+
+    public function __construct($obj)
+    {
+        $this->_obj = $obj;
+        $this->_serialized = serialize($this->_obj);
+    }
+    public function get()
+    {
+        return $this->_obj;
+    }
+    public function __sleep()
+    {
+        $this->_serialized = serialize($this->_obj);
+        return array(
+            "\0" . __CLASS__ . "\0_serialized",
+        );
+    }
+    public function __wakeup()
+    {
+               $this->_obj = unserialize($this->_serialized);
+       }
+}
+
+echo "SCRIPT START" . PHP_EOL;
+
+$objA = new myObjA();
+$objB = new myObjB();
+$objC = new myObjC();
+
+$objB->attrA = new ArrayIterator();
+$objB->attrB = $objA;
+
+$objC->attrC = $objB;
+$objC->attrD = $objA;
+
+$list = new myList($objC);
+
+echo 'check ' . check($list->get()) . PHP_EOL;
+
+echo "start serialize/unserialize" . PHP_EOL;
+$newList = unserialize(serialize($list));
+echo "finish serialize/unserialize" . PHP_EOL;
+
+//after unserialize the property myObjC::attrD is null instead of expected object
+echo 'check ' . check($newList->get()) . PHP_EOL;
+
+echo "SCRIPT END" . PHP_EOL ;
+
+function check(myObjC $obj) {
+
+    if (!is_object($obj->attrC)) {
+        return 'failed (myObjC::attrC => ' . var_export($obj->attrC, true) . ')';
+    }
+    if (!is_object($obj->attrD)) {
+        return 'failed (myObjC::attrD => ' . var_export($obj->attrD, true) . ')';
+    }
+    return 'successful';
+}
+?>
+--EXPECT--
+SCRIPT START
+check successful
+start serialize/unserialize
+finish serialize/unserialize
+check successful
+SCRIPT END
+