[haiku-commits] r35575 - haiku/trunk/src/system/kernel/vm

  • From: ingo_weinhold@xxxxxx
  • To: haiku-commits@xxxxxxxxxxxxx
  • Date: Mon, 22 Feb 2010 20:03:34 +0100 (CET)

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);
+                                       }
                                }
                        }
                }


Other related posts:

  • » [haiku-commits] r35575 - haiku/trunk/src/system/kernel/vm - ingo_weinhold