From edf53e2073bf415474c8779bcf35f42d554e5cca Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Wed, 20 Feb 2008 09:45:47 +0000 Subject: [PATCH] Added checks for destoied objects --- Zend/zend_gc.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/Zend/zend_gc.c b/Zend/zend_gc.c index 3cdf3829d6b..07ced9c6a6f 100644 --- a/Zend/zend_gc.c +++ b/Zend/zend_gc.c @@ -239,7 +239,8 @@ static void zobj_scan_black(struct _store_object *obj, zval *pz TSRMLS_DC) { GC_SET_BLACK(obj->buffered); - if (EXPECTED(Z_OBJ_HANDLER_P(pz, get_properties) != NULL)) { + if (EXPECTED(EG(objects_store).object_buckets[Z_OBJ_HANDLE_P(pz)].valid && + Z_OBJ_HANDLER_P(pz, get_properties) != NULL)) { zend_hash_apply(Z_OBJPROP_P(pz), (apply_func_t) children_scan_black TSRMLS_CC); } } @@ -278,7 +279,8 @@ static void zobj_mark_grey(struct _store_object *obj, zval *pz TSRMLS_DC) if (GC_GET_COLOR(obj->buffered) != GC_GREY) { GC_BENCH_INC(zobj_marked_grey); GC_SET_COLOR(obj->buffered, GC_GREY); - if (EXPECTED(Z_OBJ_HANDLER_P(pz, get_properties) != NULL)) { + if (EXPECTED(EG(objects_store).object_buckets[Z_OBJ_HANDLE_P(pz)].valid && + Z_OBJ_HANDLER_P(pz, get_properties) != NULL)) { zend_hash_apply(Z_OBJPROP_P(pz), (apply_func_t) children_mark_grey TSRMLS_CC); } } @@ -353,7 +355,8 @@ static void zobj_scan(zval *pz TSRMLS_DC) 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)) { + if (EXPECTED(EG(objects_store).object_buckets[Z_OBJ_HANDLE_P(pz)].valid && + Z_OBJ_HANDLER_P(pz, get_properties) != NULL)) { zend_hash_apply(Z_OBJPROP_P(pz), (apply_func_t) children_scan TSRMLS_CC); } } @@ -417,7 +420,8 @@ static void zobj_collect_white(zval *pz TSRMLS_DC) if (obj->buffered == (gc_root_buffer*)GC_WHITE) { GC_SET_BLACK(obj->buffered); - if (EXPECTED(Z_OBJ_HANDLER_P(pz, get_properties) != NULL)) { + if (EXPECTED(EG(objects_store).object_buckets[Z_OBJ_HANDLE_P(pz)].valid && + Z_OBJ_HANDLER_P(pz, get_properties) != NULL)) { zend_hash_apply(Z_OBJPROP_P(pz), (apply_func_t) children_collect_white TSRMLS_CC); } }