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
This commit is contained in:
-1
@@ -9,7 +9,6 @@
|
|||||||
#include <KernelExport.h>
|
#include <KernelExport.h>
|
||||||
|
|
||||||
#include <util/AutoLock.h>
|
#include <util/AutoLock.h>
|
||||||
//#include <vm.h>
|
|
||||||
#include <vm_address_space.h>
|
#include <vm_address_space.h>
|
||||||
#include <vm_page.h>
|
#include <vm_page.h>
|
||||||
|
|
||||||
|
|||||||
+6
-4
@@ -264,8 +264,9 @@ block_cache::FreeBlock(cached_block *block)
|
|||||||
ASSERT(range != NULL);
|
ASSERT(range != NULL);
|
||||||
range->Free(this, block);
|
range->Free(this, block);
|
||||||
|
|
||||||
Free(block->original);
|
if (block->original != NULL || block->parent_data != NULL)
|
||||||
Free(block->parent_data);
|
panic("block_cache::FreeBlock(): %p, %p\n", block->original, block->parent_data);
|
||||||
|
|
||||||
#ifdef DEBUG_CHANGED
|
#ifdef DEBUG_CHANGED
|
||||||
Free(block->compare);
|
Free(block->compare);
|
||||||
#endif
|
#endif
|
||||||
@@ -804,8 +805,9 @@ cache_abort_transaction(void *_cache, int32 id)
|
|||||||
cache->Free(block->original);
|
cache->Free(block->original);
|
||||||
block->original = NULL;
|
block->original = NULL;
|
||||||
}
|
}
|
||||||
if (transaction->has_sub_transaction && block->parent_data != block->data) {
|
if (transaction->has_sub_transaction) {
|
||||||
cache->Free(block->parent_data);
|
if (block->parent_data != block->data)
|
||||||
|
cache->Free(block->parent_data);
|
||||||
block->parent_data = NULL;
|
block->parent_data = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user