dmitry Tue Jan 29 09:59:42 2008 UTC
Added files: (Branch: PHP_5_3)
/ZendEngine2/tests bug43918.phpt
Modified files:
/ZendEngine2 zend_gc.c zend_gc.h
/php-src/ext/simplexml simplexml.c
Log:
Fixed bug #43918 (Segmentation fault in garbage collector)
http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_gc.c?r1=1.1.2.2&r2=1.1.2.3&diff_format=u
Index: ZendEngine2/zend_gc.c
diff -u ZendEngine2/zend_gc.c:1.1.2.2 ZendEngine2/zend_gc.c:1.1.2.3
--- ZendEngine2/zend_gc.c:1.1.2.2 Thu Jan 24 11:48:54 2008
+++ ZendEngine2/zend_gc.c Tue Jan 29 09:59:42 2008
@@ -17,7 +17,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: zend_gc.c,v 1.1.2.2 2008/01/24 11:48:54 dmitry Exp $ */
+/* $Id: zend_gc.c,v 1.1.2.3 2008/01/29 09:59:42 dmitry Exp $ */
#include "zend.h"
#include "zend_API.h"
@@ -47,6 +47,7 @@
static void gc_globals_ctor_ex(zend_gc_globals *gc_globals TSRMLS_DC)
{
gc_globals->gc_enabled = 0;
+ gc_globals->gc_active = 0;
gc_globals->buf = NULL;
@@ -156,8 +157,11 @@
zv->refcount__gc++;
gc_collect_cycles(TSRMLS_C);
zv->refcount__gc--;
- GC_ZVAL_SET_PURPLE(zv);
newRoot = GC_G(unused);
+ if (!newRoot) {
+ return;
+ }
+ GC_ZVAL_SET_PURPLE(zv);
}
GC_G(unused) = newRoot->prev;
@@ -183,7 +187,8 @@
{
struct _store_object *obj;
- if (UNEXPECTED(Z_OBJ_HT_P(zv)->get_properties == NULL)) {
+ if (UNEXPECTED(Z_OBJ_HT_P(zv)->get_properties == NULL ||
+ EG(objects_store).object_buckets == NULL)) {
return;
}
@@ -203,9 +208,12 @@
zv->refcount__gc++;
gc_collect_cycles(TSRMLS_C);
zv->refcount__gc--;
+ newRoot = GC_G(unused);
+ if (!newRoot) {
+ return;
+ }
obj =
&EG(objects_store).object_buckets[Z_OBJ_HANDLE_P(zv)].bucket.obj;
GC_SET_PURPLE(obj->buffered);
- newRoot = GC_G(unused);
}
GC_G(unused) = newRoot->prev;
@@ -240,7 +248,7 @@
{
GC_ZVAL_SET_BLACK(pz);
- if (Z_TYPE_P(pz) == IS_OBJECT) {
+ if (Z_TYPE_P(pz) == IS_OBJECT && EG(objects_store).object_buckets) {
struct _store_object *obj =
&EG(objects_store).object_buckets[Z_OBJ_HANDLE_P(pz)].bucket.obj;
obj->refcount++;
@@ -282,7 +290,7 @@
GC_BENCH_INC(zval_marked_grey);
GC_ZVAL_SET_COLOR(pz, GC_GREY);
- if (Z_TYPE_P(pz) == IS_OBJECT) {
+ if (Z_TYPE_P(pz) == IS_OBJECT &&
EG(objects_store).object_buckets) {
struct _store_object *obj =
&EG(objects_store).object_buckets[Z_OBJ_HANDLE_P(pz)].bucket.obj;
obj->refcount--;
@@ -309,7 +317,7 @@
gc_root_buffer *current = GC_G(roots).next;
while (current != &GC_G(roots)) {
- if (current->handle) {
+ if (current->handle && EG(objects_store).object_buckets) {
struct _store_object *obj =
&EG(objects_store).object_buckets[current->handle].bucket.obj;
if (GC_GET_COLOR(obj->buffered) == GC_PURPLE) {
@@ -337,15 +345,17 @@
static void zobj_scan(zval *pz TSRMLS_DC)
{
- struct _store_object *obj =
&EG(objects_store).object_buckets[Z_OBJ_HANDLE_P(pz)].bucket.obj;
+ if (EG(objects_store).object_buckets) {
+ struct _store_object *obj =
&EG(objects_store).object_buckets[Z_OBJ_HANDLE_P(pz)].bucket.obj;
- if (GC_GET_COLOR(obj->buffered) == GC_GREY) {
- if (obj->refcount > 0) {
- zobj_scan_black(obj, pz TSRMLS_CC);
- } else {
- GC_SET_COLOR(obj->buffered, GC_WHITE);
- if (EXPECTED(Z_OBJ_HANDLER_P(pz, get_properties) !=
NULL)) {
- zend_hash_apply(Z_OBJPROP_P(pz), (apply_func_t)
children_scan TSRMLS_CC);
+ if (GC_GET_COLOR(obj->buffered) == GC_GREY) {
+ if (obj->refcount > 0) {
+ zobj_scan_black(obj, pz TSRMLS_CC);
+ } else {
+ GC_SET_COLOR(obj->buffered, GC_WHITE);
+ if (EXPECTED(Z_OBJ_HANDLER_P(pz,
get_properties) != NULL)) {
+ zend_hash_apply(Z_OBJPROP_P(pz),
(apply_func_t) children_scan TSRMLS_CC);
+ }
}
}
}
@@ -400,14 +410,16 @@
static void zobj_collect_white(zval *pz TSRMLS_DC)
{
- zend_object_handle handle = Z_OBJ_HANDLE_P(pz);
- struct _store_object *obj =
&EG(objects_store).object_buckets[handle].bucket.obj;
+ if (EG(objects_store).object_buckets) {
+ zend_object_handle handle = Z_OBJ_HANDLE_P(pz);
+ struct _store_object *obj =
&EG(objects_store).object_buckets[handle].bucket.obj;
- if (obj->buffered == (gc_root_buffer*)GC_WHITE) {
- GC_SET_BLACK(obj->buffered);
+ if (obj->buffered == (gc_root_buffer*)GC_WHITE) {
+ GC_SET_BLACK(obj->buffered);
- if (EXPECTED(Z_OBJ_HANDLER_P(pz, get_properties) != NULL)) {
- zend_hash_apply(Z_OBJPROP_P(pz), (apply_func_t)
children_collect_white TSRMLS_CC);
+ if (EXPECTED(Z_OBJ_HANDLER_P(pz, get_properties) !=
NULL)) {
+ zend_hash_apply(Z_OBJPROP_P(pz), (apply_func_t)
children_collect_white TSRMLS_CC);
+ }
}
}
}
@@ -446,7 +458,7 @@
gc_root_buffer *current = GC_G(roots).next;
while (current != &GC_G(roots)) {
- if (current->handle) {
+ if (current->handle && EG(objects_store).object_buckets) {
struct _store_object *obj =
&EG(objects_store).object_buckets[current->handle].bucket.obj;
zval z;
@@ -472,11 +484,16 @@
if (GC_G(roots).next != &GC_G(roots)) {
zval_gc_info *p, *q;
+ if (GC_G(gc_active)) {
+ return 0;
+ }
GC_G(gc_runs)++;
GC_G(zval_to_free) = NULL;
gc_mark_roots(TSRMLS_C);
+ GC_G(gc_active) = 1;
gc_scan_roots(TSRMLS_C);
gc_collect_roots(TSRMLS_C);
+ GC_G(gc_active) = 0;
p = GC_G(zval_to_free);
GC_G(zval_to_free) = NULL;
http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_gc.h?r1=1.1.2.2&r2=1.1.2.3&diff_format=u
Index: ZendEngine2/zend_gc.h
diff -u ZendEngine2/zend_gc.h:1.1.2.2 ZendEngine2/zend_gc.h:1.1.2.3
--- ZendEngine2/zend_gc.h:1.1.2.2 Thu Jan 24 10:49:26 2008
+++ ZendEngine2/zend_gc.h Tue Jan 29 09:59:42 2008
@@ -17,7 +17,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: zend_gc.h,v 1.1.2.2 2008/01/24 10:49:26 dmitry Exp $ */
+/* $Id: zend_gc.h,v 1.1.2.3 2008/01/29 09:59:42 dmitry Exp $ */
#ifndef ZEND_GC_H
#define ZEND_GC_H
@@ -98,6 +98,7 @@
typedef struct _zend_gc_globals {
zend_bool gc_enabled;
+ zend_bool gc_active;
gc_root_buffer *buf; /* preallocated arrays
of buffers */
gc_root_buffer roots; /* list of possible
roots of cycles */
http://cvs.php.net/viewvc.cgi/php-src/ext/simplexml/simplexml.c?r1=1.151.2.22.2.35.2.8&r2=1.151.2.22.2.35.2.9&diff_format=u
Index: php-src/ext/simplexml/simplexml.c
diff -u php-src/ext/simplexml/simplexml.c:1.151.2.22.2.35.2.8
php-src/ext/simplexml/simplexml.c:1.151.2.22.2.35.2.9
--- php-src/ext/simplexml/simplexml.c:1.151.2.22.2.35.2.8 Wed Jan 23
09:52:57 2008
+++ php-src/ext/simplexml/simplexml.c Tue Jan 29 09:59:42 2008
@@ -18,7 +18,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: simplexml.c,v 1.151.2.22.2.35.2.8 2008/01/23 09:52:57 tony2001 Exp $ */
+/* $Id: simplexml.c,v 1.151.2.22.2.35.2.9 2008/01/29 09:59:42 dmitry Exp $ */
#ifdef HAVE_CONFIG_H
#include "config.h"
@@ -1081,6 +1081,9 @@
zend_hash_init(rv, 0, NULL, ZVAL_PTR_DTOR, 0);
}
else if (sxe->properties) {
+ if (GC_G(gc_active)) {
+ return sxe->properties;
+ }
zend_hash_clean(sxe->properties);
rv = sxe->properties;
} else {
@@ -2504,7 +2507,7 @@
{
php_info_print_table_start();
php_info_print_table_header(2, "Simplexml support", "enabled");
- php_info_print_table_row(2, "Revision", "$Revision: 1.151.2.22.2.35.2.8
$");
+ php_info_print_table_row(2, "Revision", "$Revision: 1.151.2.22.2.35.2.9
$");
php_info_print_table_row(2, "Schema support",
#ifdef LIBXML_SCHEMAS_ENABLED
"enabled");
http://cvs.php.net/viewvc.cgi/ZendEngine2/tests/bug43918.phpt?view=markup&rev=1.1
Index: ZendEngine2/tests/bug43918.phpt
+++ ZendEngine2/tests/bug43918.phpt
--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php