Browse Source

Merge branch 'PHP-7.0'

* PHP-7.0:
  Fixed bug #72229 (Wrong reference when serialize/unserialize an object)
pull/1912/head
Xinchen Hui 10 years ago
parent
commit
60d743dd3b
  1. 53
      ext/standard/tests/serialize/bug72229.phpt
  2. 4
      ext/standard/var.c

53
ext/standard/tests/serialize/bug72229.phpt

@ -0,0 +1,53 @@
--TEST--
Bug #72229 (Wrong reference when serialize/unserialize an object)
--FILE--
<?php
class C1
{
public $arr1 = array();
public $arr2 = array();
public function __construct()
{
$this->arr1[0] = $this;
$this->arr2[0] = $this->arr1[0];
$var1 = &$this->arr1[0]; // Set a reference...
unset($var1); // ... and unset it.
}
}
$Obj1 = new C1();
$txt1 = serialize($Obj1);
$Obj2 = unserialize($txt1);
$Obj1->arr2[0] = 50;
print_r($Obj1);
$Obj2->arr2[0] = 50;
print_r($Obj2);
?>
--EXPECTF--
C1 Object
(
[arr1] => Array
(
[0] => C1 Object
*RECURSION*
)
[arr2] => Array
(
[0] => 50
)
)
C1 Object
(
[arr1] => Array
(
[0] => C1 Object
*RECURSION*
)
[arr2] => Array
(
[0] => 50
)
)

4
ext/standard/var.c

@ -957,6 +957,10 @@ again:
php_var_serialize_string(buf, ZSTR_VAL(key), ZSTR_LEN(key));
}
if (Z_ISREF_P(data) && Z_REFCOUNT_P(data) == 1) {
ZVAL_UNREF(data);
}
/* we should still add element even if it's not OK,
* since we already wrote the length of the array before */
if ((Z_TYPE_P(data) == IS_ARRAY && Z_TYPE_P(struc) == IS_ARRAY && Z_ARR_P(data) == Z_ARR_P(struc))

Loading…
Cancel
Save