mirror of
https://github.com/php/php-src.git
synced 2025-08-19 17:04:47 +02:00
Merge branch 'PHP-5.3' into PHP-5.4
* PHP-5.3: Fixed bug #63635 (Segfault in gc_collect_cycles) Conflicts: NEWS
This commit is contained in:
commit
f877d7fee6
3 changed files with 63 additions and 2 deletions
1
NEWS
1
NEWS
|
@ -3,6 +3,7 @@ PHP NEWS
|
|||
?? ??? 2012, PHP 5.4.10
|
||||
|
||||
- Core:
|
||||
. Fixed bug #63635 (Segfault in gc_collect_cycles). (Dmitry)
|
||||
. Fixed bug #63468 (wrong called method as callback with inheritance).
|
||||
(Laruence)
|
||||
. Fixed bug #61272 (ob_start callback gets passed empty string).
|
||||
|
|
58
Zend/tests/bug63635.phpt
Normal file
58
Zend/tests/bug63635.phpt
Normal file
|
@ -0,0 +1,58 @@
|
|||
--TEST--
|
||||
Bug #63635 (Segfault in gc_collect_cycles)
|
||||
--FILE--
|
||||
<?php
|
||||
class Node {
|
||||
public $parent = NULL;
|
||||
public $childs = array();
|
||||
|
||||
function __construct(Node $parent=NULL) {
|
||||
if ($parent) {
|
||||
$parent->childs[] = $this;
|
||||
}
|
||||
$this->childs[] = $this;
|
||||
}
|
||||
|
||||
function __destruct() {
|
||||
$this->childs = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
define("MAX", 16);
|
||||
|
||||
for ($n = 0; $n < 20; $n++) {
|
||||
$top = new Node();
|
||||
for ($i=0 ; $i<MAX ; $i++) {
|
||||
$ci = new Node($top);
|
||||
for ($j=0 ; $j<MAX ; $j++) {
|
||||
$cj = new Node($ci);
|
||||
for ($k=0 ; $k<MAX ; $k++) {
|
||||
$ck = new Node($cj);
|
||||
}
|
||||
}
|
||||
}
|
||||
echo "$n\n";
|
||||
}
|
||||
echo "ok\n";
|
||||
--EXPECT--
|
||||
0
|
||||
1
|
||||
2
|
||||
3
|
||||
4
|
||||
5
|
||||
6
|
||||
7
|
||||
8
|
||||
9
|
||||
10
|
||||
11
|
||||
12
|
||||
13
|
||||
14
|
||||
15
|
||||
16
|
||||
17
|
||||
18
|
||||
19
|
||||
ok
|
|
@ -644,7 +644,8 @@ tail_call:
|
|||
struct _store_object *obj = &EG(objects_store).object_buckets[Z_OBJ_HANDLE_P(pz)].bucket.obj;
|
||||
|
||||
if (obj->buffered == (gc_root_buffer*)GC_WHITE) {
|
||||
GC_SET_BLACK(obj->buffered);
|
||||
/* PURPLE instead of BLACK to prevent buffering in nested gc calls */
|
||||
GC_SET_PURPLE(obj->buffered);
|
||||
|
||||
if (EXPECTED(EG(objects_store).object_buckets[Z_OBJ_HANDLE_P(pz)].valid &&
|
||||
(get_gc = Z_OBJ_HANDLER_P(pz, get_gc)) != NULL)) {
|
||||
|
@ -715,7 +716,8 @@ static void zobj_collect_white(zval *pz TSRMLS_DC)
|
|||
struct _store_object *obj = &EG(objects_store).object_buckets[Z_OBJ_HANDLE_P(pz)].bucket.obj;
|
||||
|
||||
if (obj->buffered == (gc_root_buffer*)GC_WHITE) {
|
||||
GC_SET_BLACK(obj->buffered);
|
||||
/* PURPLE instead of BLACK to prevent buffering in nested gc calls */
|
||||
GC_SET_PURPLE(obj->buffered);
|
||||
|
||||
if (EXPECTED(EG(objects_store).object_buckets[Z_OBJ_HANDLE_P(pz)].valid &&
|
||||
(get_gc = Z_OBJ_HANDLER_P(pz, get_gc)) != NULL)) {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue