Skip to content

Commit e8ae795

Browse files
committed
such a weird hack probably helps in finding regressions in the future
1 parent f6ff3a2 commit e8ae795

File tree

1 file changed

+83
-0
lines changed

1 file changed

+83
-0
lines changed
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
--TEST--
2+
Bug #65806 (unserialize fails with object which is referenced multiple times)
3+
--FILE--
4+
<?php
5+
class myObjA {}
6+
class myObjB {
7+
public $attrA;
8+
public $attrB;
9+
}
10+
class myObjC {
11+
public $attrC;
12+
public $attrD;
13+
}
14+
class myList {
15+
private $_serialized;
16+
private $_obj;
17+
18+
public function __construct($obj)
19+
{
20+
$this->_obj = $obj;
21+
$this->_serialized = serialize($this->_obj);
22+
}
23+
public function get()
24+
{
25+
return $this->_obj;
26+
}
27+
public function __sleep()
28+
{
29+
$this->_serialized = serialize($this->_obj);
30+
return array(
31+
"\0" . __CLASS__ . "\0_serialized",
32+
);
33+
}
34+
public function __wakeup()
35+
{
36+
$this->_obj = unserialize($this->_serialized);
37+
}
38+
}
39+
40+
echo "SCRIPT START" . PHP_EOL;
41+
42+
$objA = new myObjA();
43+
$objB = new myObjB();
44+
$objC = new myObjC();
45+
46+
$objB->attrA = new ArrayIterator();
47+
$objB->attrB = $objA;
48+
49+
$objC->attrC = $objB;
50+
$objC->attrD = $objA;
51+
52+
$list = new myList($objC);
53+
54+
echo 'check ' . check($list->get()) . PHP_EOL;
55+
56+
echo "start serialize/unserialize" . PHP_EOL;
57+
$newList = unserialize(serialize($list));
58+
echo "finish serialize/unserialize" . PHP_EOL;
59+
60+
//after unserialize the property myObjC::attrD is null instead of expected object
61+
echo 'check ' . check($newList->get()) . PHP_EOL;
62+
63+
echo "SCRIPT END" . PHP_EOL ;
64+
65+
function check(myObjC $obj) {
66+
67+
if (!is_object($obj->attrC)) {
68+
return 'failed (myObjC::attrC => ' . var_export($obj->attrC, true) . ')';
69+
}
70+
if (!is_object($obj->attrD)) {
71+
return 'failed (myObjC::attrD => ' . var_export($obj->attrD, true) . ')';
72+
}
73+
return 'successful';
74+
}
75+
?>
76+
--EXPECT--
77+
SCRIPT START
78+
check successful
79+
start serialize/unserialize
80+
finish serialize/unserialize
81+
check successful
82+
SCRIPT END
83+

0 commit comments

Comments
 (0)