cvs: ZendEngine2 / zend_gc.c /tests bug47343.phpt
[email protected] ("Dmitry Stogov") Wed, 18 Feb 2009 12:03:03 -0000
| Newsgroups | php.zend-engine.cvs |
|---|---|
| Message-ID | <cvsdmitry1234958583@cvsserver> |
dmitry Wed Feb 18 12:03:03 2009 UTC
Modified files:
/ZendEngine2 zend_gc.c
/ZendEngine2/tests bug47343.phpt
Log:
Fixed bug #47343 (gc_collect_cycles causes a segfault when called within a destructor in one case)
http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_gc.c?r1=1.21&r2=1.22&diff_format=u
Index: ZendEngine2/zend_gc.c
diff -u ZendEngine2/zend_gc.c:1.21 ZendEngine2/zend_gc.c:1.22
--- ZendEngine2/zend_gc.c:1.21 Mon Feb 9 08:55:35 2009
+++ ZendEngine2/zend_gc.c Wed Feb 18 12:03:03 2009
@@ -17,7 +17,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: zend_gc.c,v 1.21 2009/02/09 08:55:35 dmitry Exp $ */
+/* $Id: zend_gc.c,v 1.22 2009/02/18 12:03:03 dmitry Exp $ */
#include "zend.h"
#include "zend_API.h"
@@ -521,7 +521,7 @@
}
}
-#define FREE_LIST_END ((zval_gc_info*)((-1)|~GC_COLOR))
+#define FREE_LIST_END ((zval_gc_info*)(~(zend_uintptr_t)GC_COLOR))
ZEND_API int gc_collect_cycles(TSRMLS_D)
{
http://cvs.php.net/viewvc.cgi/ZendEngine2/tests/bug47343.phpt?r1=1.1&r2=1.2&diff_format=u
Index: ZendEngine2/tests/bug47343.phpt
diff -u /dev/null ZendEngine2/tests/bug47343.phpt:1.2
--- /dev/null Wed Feb 18 12:03:03 2009
+++ ZendEngine2/tests/bug47343.phpt Wed Feb 18 12:03:03 2009
@@ -0,0 +1,44 @@
+--TEST--
+Bug #47343 (gc_collect_cycles causes a segfault when called within a destructor in one case)
+--FILE--
+<?php
+class A
+{
+ public function __destruct()
+ {
+ gc_collect_cycles();
+ }
+
+ public function getB()
+ {
+ $this->data['foo'] = new B($this);
+ $this->data['bar'] = new B($this);
+ // Return either of the above
+ return $this->data['foo'];
+ }
+}
+
+class B
+{
+ public function B($A)
+ {
+ $this->A = $A;
+ }
+
+ public function __destruct()
+ {
+ }
+}
+
+for ($i = 0; $i < 2; $i++)
+{
+ $Aobj = new A;
+ $Bobj = $Aobj->getB();
+ unset($Bobj);
+ unset($Aobj);
+}
+
+echo "DONE\n";
+?>
+--EXPECT--
+DONE