com php-src: such a weird hack probably helps in finding regressions in the future: ext/standard/tests/serialize/bug65806.phpt
| From: | Michael Wallner | Date: | Fri, 04 Oct 2013 14:11:49 +0000 |
| Subject: | com php-src: such a weird hack probably helps in finding regressions in the future: ext/standard/tests/serialize/bug65806.phpt | ||
| Groups: | php.cvs | ||
| Request: | Send a blank email to php-cvs+get-73351@lists.php.net to get a copy of this message | ||
Commit: e8ae795529eff83482797dff0d1a1de7f0a84c8d
Author: Michael Wallner <mike@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
+