1
0
mirror of https://github.com/php/php-src.git synced 2026-04-01 05:02:27 +02:00

Merge branch 'PHP-5.5'

* PHP-5.5:
  fix bug #64146 (serialize incorrectly saving objects when they are cloned)
This commit is contained in:
Michael Wallner
2013-10-04 16:17:46 +02:00
2 changed files with 62 additions and 4 deletions

View File

@@ -0,0 +1,60 @@
--TEST--
Bug #64146 (serialize incorrectly saving objects when they are cloned)
--FILE--
<?php
echo "Test\n";
class A
{
public $a = array();
public function __construct()
{
$this->a[] = new B(1);
$this->a[] = new B(2);
}
}
class B implements Serializable
{
public $b;
public function __construct($c)
{
$this->b = new C($c);
}
public function serialize()
{
return serialize(clone $this->b);
}
public function unserialize($data)
{
$this->b = unserialize($data);
}
}
class C
{
public $c;
public function __construct($c)
{
$this->c = $c;
}
}
$a = unserialize(serialize(new A()));
print $a->a[0]->b->c . "\n";
print $a->a[1]->b->c . "\n";
?>
Done
--EXPECT--
Test
1
2
Done

View File

@@ -549,11 +549,9 @@ static inline int php_add_var_hash(HashTable *var_hash, zval *var, void *var_old
char id[32], *p;
register int len;
/* relies on "(long)" being a perfect hash function for data pointers,
* however the actual identity of an object has had to be determined
* by its object handle since 5.0. */
if ((Z_TYPE_P(var) == IS_OBJECT) && Z_OBJ_HT_P(var)->get_class_entry) {
p = smart_str_print_long(id + sizeof(id) - 1, (long) Z_OBJ_HANDLE_P(var));
p = smart_str_print_long(id + sizeof(id) - 1,
(long) zend_objects_get_address(var TSRMLS_CC));
*(--p) = 'O';
len = id + sizeof(id) - 1 - p;
} else {