Commit:    e8ae795529eff83482797dff0d1a1de7f0a84c8d
Author:    Michael Wallner <m...@php.net>         Fri, 4 Oct 2013 16:11:49 +0200
Parents:   f6ff3a28d60c24dea2a05344d9b7eb823f09b4e5
Branches:  PHP-5.4 PHP-5.5 master

Link:       
http://git.php.net/?p=php-src.git;a=commitdiff;h=e8ae795529eff83482797dff0d1a1de7f0a84c8d

Log:
such a weird hack probably helps in finding regressions in the future

Changed paths:
  A  ext/standard/tests/serialize/bug65806.phpt


Diff:
diff --git a/ext/standard/tests/serialize/bug65806.phpt 
b/ext/standard/tests/serialize/bug65806.phpt
new file mode 100644
index 0000000..19fab95
--- /dev/null
+++ b/ext/standard/tests/serialize/bug65806.phpt
@@ -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
+


--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to