Author: bonefish Date: 2010-02-22 20:03:34 +0100 (Mon, 22 Feb 2010) New Revision: 35575 Changeset: http://dev.haiku-os.org/changeset/35575/haiku Ticket: http://dev.haiku-os.org/ticket/5453 Modified: haiku/trunk/src/system/kernel/vm/VMAnonymousCache.cpp Log: VMAnonymousCache::_MergeSwapPages(): Missing check which could lead to a NULL pointer access. Should fix #5453. Modified: haiku/trunk/src/system/kernel/vm/VMAnonymousCache.cpp =================================================================== --- haiku/trunk/src/system/kernel/vm/VMAnonymousCache.cpp 2010-02-22 18:10:29 UTC (rev 35574) +++ haiku/trunk/src/system/kernel/vm/VMAnonymousCache.cpp 2010-02-22 19:03:34 UTC (rev 35575) @@ -933,6 +933,7 @@ (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 @@ (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 @@ 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); + } } } }