From cec2be94313fed5c90334e4402d63b4b8f697753 Mon Sep 17 00:00:00 2001 From: theraven Date: Tue, 3 Apr 2012 09:45:26 +0000 Subject: [PATCH] Fix double-free when making C++ objects __block --- blocks_runtime.m | 16 +--------------- 1 file changed, 1 insertion(+), 15 deletions(-) diff --git a/blocks_runtime.m b/blocks_runtime.m index d84069c..0ba7961 100644 --- a/blocks_runtime.m +++ b/blocks_runtime.m @@ -198,6 +198,7 @@ void _Block_object_dispose(const void *object, const int flags) { struct block_byref_obj *src = (struct block_byref_obj*)object; + src = src->forwarding; if (src->isa == _HeapBlockByRef) { int refcount = (src->flags & BLOCK_REFCOUNT_MASK) == 0 ? 0 : decrement24(&src->flags); @@ -210,21 +211,6 @@ void _Block_object_dispose(const void *object, const int flags) gc->free(src); } } - else - { - // Call nontrivial destructors, but don't free the storage - if(IS_SET(src->flags, BLOCK_HAS_COPY_DISPOSE) && (0 != src->byref_dispose)) - { - src->byref_dispose(src); - } - // If this block has been promoted to the heap, decrement its - // reference count / destroy it if the heap version is already - // dead. - if (src->forwarding != src) - { - _Block_object_dispose(src->forwarding, flags | BLOCK_BYREF_CALLER); - } - } } else if (IS_SET(flags, BLOCK_FIELD_IS_BLOCK)) {