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