From 140dd512935a49cbf6d00db16341ecc2f8ed011f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Axel=20D=C3=B6rfler?= Date: Fri, 30 Dec 2005 18:47:16 +0000 Subject: [PATCH] cache_abort_transaction() could let cached_block::parent_data have the same value as cached_block::data - which led to a crash as block_cache::FreeBlock() tried to free both later. Since neither cached_block::parent_data nor cached_block::original are supposed to be != NULL in block_cache::FreeBlock(), they are no longer freed, but the system panics if one of them is not NULL. This should fix bug #77. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@15749 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/system/kernel/cache/block_allocator.cpp | 1 - src/system/kernel/cache/block_cache.cpp | 10 ++++++---- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/system/kernel/cache/block_allocator.cpp b/src/system/kernel/cache/block_allocator.cpp index 17da1330df..9444b45ce4 100644 --- a/src/system/kernel/cache/block_allocator.cpp +++ b/src/system/kernel/cache/block_allocator.cpp @@ -9,7 +9,6 @@ #include #include -//#include #include #include diff --git a/src/system/kernel/cache/block_cache.cpp b/src/system/kernel/cache/block_cache.cpp index 1b2df13ebe..62e53139aa 100644 --- a/src/system/kernel/cache/block_cache.cpp +++ b/src/system/kernel/cache/block_cache.cpp @@ -264,8 +264,9 @@ block_cache::FreeBlock(cached_block *block) ASSERT(range != NULL); range->Free(this, block); - Free(block->original); - Free(block->parent_data); + if (block->original != NULL || block->parent_data != NULL) + panic("block_cache::FreeBlock(): %p, %p\n", block->original, block->parent_data); + #ifdef DEBUG_CHANGED Free(block->compare); #endif @@ -804,8 +805,9 @@ cache_abort_transaction(void *_cache, int32 id) cache->Free(block->original); block->original = NULL; } - if (transaction->has_sub_transaction && block->parent_data != block->data) { - cache->Free(block->parent_data); + if (transaction->has_sub_transaction) { + if (block->parent_data != block->data) + cache->Free(block->parent_data); block->parent_data = NULL; }