Bug #64195 [Opn->Nab]: clone object with circular reference cause segfault
| From: | johannes@php.net | Date: | Tue, 12 Feb 2013 11:49:35 +0000 |
| Subject: | Bug #64195 [Opn->Nab]: clone object with circular reference cause segfault | ||
| References: | 1 | Groups: | php.bugs |
| Request: | Send a blank email to php-bugs+get-176576@lists.php.net to get a copy of this message | ||
Edit report at https://bugs.php.net/bug.php?id=64195&edit=1
ID: 64195
Updated by: johannes@php.net
Reported by: vovan-ve at yandex dot ru
Summary: clone object with circular reference cause segfault
-Status: Open
+Status: Not a bug
Type: Bug
Package: Class/Object related
Operating System: linux
PHP Version: 5.4.11
Block user comment: N
Private report: N
New Comment:
Thank you for taking the time to write to us, but this is not
a bug. Please double-check the documentation available at
http://www.php.net/manual/ and the instructions on how to
report
a bug at http://bugs.php.net/how-to-report.php
Infinite recursion leads to a stack overflow (clone calls clone, calls clone, calls clone, ...) we
have no good way to handle this.
Previous Comments:
------------------------------------------------------------------------
[2013-02-12 11:33:20] vovan-ve at yandex dot ru
Description:
------------
There are two objects of the same class. Both objects has a property. There are
circular object reference: $a->prop === $b && $b->prop === $a. The class has
a __clone() handler which clones object in that property.
So, clonning such object cause segfault.
Yes, described architecture is ugly, but this is just for test.
Test code:
----
class A {
public $prop;
public function __clone() {
$this->prop = clone $this->prop;
}
}
// create two objects
$a = new A();
$b = new A();
// create circular reference
$b->prop = $a;
$a->prop = $b;
// see short dump with *RECURSION* marker
print_r($a);
// now make a problem
$c = clone $a;
// never will reach here
print_r($c);
----
5.5.0.a2, 5.4.11, 5.3.20 and 5.2.17 crashes with segfault. It is infinite
recursion. Also Fatal Error can be emited about memory allocation when small
memory_limit is set (1M for example).
Unlimited recursion for a simple function cause a fatal error, so the bug always should cause the
same fatal error.
Test script:
---------------
class A {
public $prop;
public function __clone() {
$this->prop = clone $this->prop;
}
}
$a = new A();
$b = new A();
$b->prop = $a;
$a->prop = $b;
print_r($a);
$c = clone $a;
print_r($c);
Expected result:
----------------
A Object
(
[prop] => A Object
(
[prop] => A Object
*RECURSION*
)
)
Fatal error: Allowed memory size of ... bytes exhausted (tried to allocate ... bytes)
Actual result:
--------------
A Object
(
[prop] => A Object
(
[prop] => A Object
*RECURSION*
)
)
Segmentation fault (core dumped)
------------------------------------------------------------------------
--
Edit this bug report at https://bugs.php.net/bug.php?id=64195&edit=1