bug74669.phpt 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. --TEST--
  2. Bug #74669: Unserialize ArrayIterator broken
  3. --FILE--
  4. <?php
  5. class Container implements Iterator
  6. {
  7. public $container;
  8. public $iterator;
  9. public function __construct()
  10. {
  11. $this->container = new ArrayObject();
  12. $this->iterator = $this->container->getIterator();
  13. }
  14. public function append($element)
  15. {
  16. $this->container->append($element);
  17. }
  18. public function current(): mixed
  19. {
  20. return $this->iterator->current();
  21. }
  22. public function next(): void
  23. {
  24. $this->iterator->next();
  25. }
  26. public function key(): mixed
  27. {
  28. return $this->iterator->key();
  29. }
  30. public function valid(): bool
  31. {
  32. return $this->iterator->valid();
  33. }
  34. public function rewind(): void
  35. {
  36. $this->iterator->rewind();
  37. }
  38. }
  39. class SelfArray extends ArrayObject
  40. {
  41. public function __construct()
  42. {
  43. parent::__construct($this);
  44. }
  45. }
  46. $container = new Container();
  47. $container->append('test1');
  48. $container->append('test2');
  49. $container->valid();
  50. $serialized = serialize($container);
  51. unset($container);
  52. $container = unserialize($serialized);
  53. foreach ($container as $key => $value) {
  54. echo $key . ' => ' . $value . PHP_EOL;
  55. }
  56. $arObj = new ArrayObject(['test1', 'test2']);
  57. $serialized = serialize($container);
  58. unset($arObj);
  59. $arObj = unserialize($serialized);
  60. foreach($arObj as $key => $value) {
  61. echo $key . ' => ' . $value . PHP_EOL;
  62. }
  63. $payload = 'x:i:33554432;O:8:"stdClass":0:{};m:a:0:{}';
  64. $str = 'C:11:"ArrayObject":' . strlen($payload) . ':{' . $payload . '}';
  65. $ao = unserialize($str);
  66. var_dump($ao['foo']);
  67. $selfArray = new SelfArray();
  68. $selfArray['foo'] = 'bar';
  69. var_dump($selfArray);
  70. $serialized = serialize($selfArray);
  71. var_dump($serialized);
  72. unset($selfArray);
  73. $selfArray = unserialize($serialized);
  74. var_dump($selfArray);
  75. var_dump($selfArray['foo']);
  76. ?>
  77. --EXPECTF--
  78. 0 => test1
  79. 1 => test2
  80. 0 => test1
  81. 1 => test2
  82. Warning: Undefined array key "foo" in %s on line %d
  83. NULL
  84. object(SelfArray)#9 (1) {
  85. ["foo"]=>
  86. string(3) "bar"
  87. }
  88. string(77) "O:9:"SelfArray":4:{i:0;i:16777216;i:1;N;i:2;a:1:{s:3:"foo";s:3:"bar";}i:3;N;}"
  89. object(SelfArray)#9 (1) {
  90. ["foo"]=>
  91. string(3) "bar"
  92. }
  93. string(3) "bar"