Fixed segfault in Zend/tests/008.phpt

This commit is contained in:
Xinchen Hui 2014-02-20 16:21:41 +08:00
parent b917458490
commit cc15eb500e
2 changed files with 8 additions and 2 deletions

View file

@ -140,6 +140,12 @@ END_EXTERN_C()
} \ } \
} while (0) } while (0)
#define GC_REMOVE_ZOBJ_FROM_BUFFER(z) do { \
if (GC_ADDRESS((z)->gc.u.v.buffer)) { \
gc_remove_zval_from_buffer(&(z)->gc TSRMLS_CC); \
} \
} while (0)
static zend_always_inline void gc_zval_check_possible_root(zval *z TSRMLS_DC) static zend_always_inline void gc_zval_check_possible_root(zval *z TSRMLS_DC)
{ {
if (Z_TYPE_P(z) == IS_ARRAY || Z_TYPE_P(z) == IS_OBJECT) { if (Z_TYPE_P(z) == IS_ARRAY || Z_TYPE_P(z) == IS_OBJECT) {

View file

@ -55,7 +55,7 @@ ZEND_API void zend_objects_store_call_destructors(zend_objects_store *objects TS
obj->gc.refcount--; obj->gc.refcount--;
if (obj->gc.refcount == 0) { if (obj->gc.refcount == 0) {
gc_remove_zval_from_buffer((zend_refcounted*)obj TSRMLS_CC); GC_REMOVE_ZOBJ_FROM_BUFFER(obj TSRMLS_CC);
} }
} }
} }
@ -86,7 +86,7 @@ ZEND_API void zend_objects_store_free_object_storage(zend_objects_store *objects
zend_object *obj = objects->object_buckets[i]; zend_object *obj = objects->object_buckets[i];
if (IS_VALID(obj)) { if (IS_VALID(obj)) {
gc_remove_zval_from_buffer((zend_refcounted*)obj TSRMLS_CC); GC_REMOVE_ZOBJ_FROM_BUFFER(obj TSRMLS_CC);
objects->object_buckets[i] = SET_INVALID(obj); objects->object_buckets[i] = SET_INVALID(obj);
if (obj->handlers->free_obj) { if (obj->handlers->free_obj) {
obj->handlers->free_obj(obj TSRMLS_CC); obj->handlers->free_obj(obj TSRMLS_CC);