From 0497cb9f12c976e8e5cd728a09a15b80d8a9eef2 Mon Sep 17 00:00:00 2001 From: Ingo Weinhold Date: Mon, 22 Feb 2010 19:03:34 +0000 Subject: [PATCH] VMAnonymousCache::_MergeSwapPages(): Missing check which could lead to a NULL pointer access. Should fix #5453. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@35575 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/system/kernel/vm/VMAnonymousCache.cpp | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/system/kernel/vm/VMAnonymousCache.cpp b/src/system/kernel/vm/VMAnonymousCache.cpp index 9918cd18f4..66985bba3e 100644 --- a/src/system/kernel/vm/VMAnonymousCache.cpp +++ b/src/system/kernel/vm/VMAnonymousCache.cpp @@ -933,6 +933,7 @@ VMAnonymousCache::_MergePagesSmallerSource(VMAnonymousCache* source) (off_t)page->cache_offset << PAGE_SHIFT); if (consumerPage == NULL) { // the page is not yet in the consumer cache - move it upwards + ASSERT_PRINT(!page->busy, "page: %p", page); source->RemovePage(page); InsertPage(page, (off_t)page->cache_offset << PAGE_SHIFT); } @@ -954,6 +955,7 @@ VMAnonymousCache::_MergePagesSmallerConsumer(VMAnonymousCache* source) (off_t)page->cache_offset << PAGE_SHIFT); if (sourcePage != NULL) { DEBUG_PAGE_ACCESS_START(sourcePage); + ASSERT_PRINT(!sourcePage->busy, "page: %p", sourcePage); source->RemovePage(sourcePage); vm_page_free(source, sourcePage); } @@ -1002,9 +1004,12 @@ VMAnonymousCache::_MergeSwapPages(VMAnonymousCache* source) if (swapBlock->swap_slots[i] != SWAP_SLOT_NONE) { vm_page* page = source->LookupPage( (off_t)(swapBlockPageIndex + i) << PAGE_SHIFT); - DEBUG_PAGE_ACCESS_START(page); - source->RemovePage(page); - vm_page_free(source, page); + if (page != NULL) { + DEBUG_PAGE_ACCESS_START(page); + ASSERT_PRINT(!page->busy, "page: %p", page); + source->RemovePage(page); + vm_page_free(source, page); + } } } }