https://git.reactos.org/?p=reactos.git;a=commitdiff;h=3ae12d5a8c4f975a3ce0be1158a0b0cf02757970

commit 3ae12d5a8c4f975a3ce0be1158a0b0cf02757970
Author:     Timo Kreuzer <[email protected]>
AuthorDate: Sun Apr 2 18:35:30 2023 +0300
Commit:     Timo Kreuzer <[email protected]>
CommitDate: Sat Jul 29 14:00:44 2023 +0300

    [NTOS:Mm] Fail gracefully when no pages are available
---
 ntoskrnl/mm/ARM3/pfnlist.c | 12 ++++++++++--
 ntoskrnl/mm/balance.c      | 11 ++++++-----
 ntoskrnl/mm/freelist.c     |  3 ++-
 3 files changed, 18 insertions(+), 8 deletions(-)

diff --git a/ntoskrnl/mm/ARM3/pfnlist.c b/ntoskrnl/mm/ARM3/pfnlist.c
index 56654d1e113..cf7871f2023 100644
--- a/ntoskrnl/mm/ARM3/pfnlist.c
+++ b/ntoskrnl/mm/ARM3/pfnlist.c
@@ -481,8 +481,11 @@ MiRemoveAnyPage(IN ULONG Color)
 
     /* Make sure PFN lock is held and we have pages */
     MI_ASSERT_PFN_LOCK_HELD();
-    ASSERT(MmAvailablePages != 0);
     ASSERT(Color < MmSecondaryColors);
+    if (MmAvailablePages == 0)
+    {
+        return 0;
+    }
 
     /* Check the colored free list */
     PageIndex = MmFreePagesByColor[FreePageList][Color].Flink;
@@ -514,6 +517,7 @@ MiRemoveAnyPage(IN ULONG Color)
 
     /* Remove the page from its list */
     PageIndex = MiRemovePageByColor(PageIndex, Color);
+    ASSERT(PageIndex != 0);
 
     /* Sanity checks */
     Pfn1 = MI_PFN_ELEMENT(PageIndex);
@@ -538,8 +542,11 @@ MiRemoveZeroPage(IN ULONG Color)
 
     /* Make sure PFN lock is held and we have pages */
     MI_ASSERT_PFN_LOCK_HELD();
-    ASSERT(MmAvailablePages != 0);
     ASSERT(Color < MmSecondaryColors);
+    if (MmAvailablePages == 0)
+    {
+        return 0;
+    }
 
     /* Check the colored zero list */
     PageIndex = MmFreePagesByColor[ZeroedPageList][Color].Flink;
@@ -583,6 +590,7 @@ MiRemoveZeroPage(IN ULONG Color)
 
     /* Remove the page from its list */
     PageIndex = MiRemovePageByColor(PageIndex, Color);
+    ASSERT(PageIndex != 0);
     ASSERT(Pfn1 == MI_PFN_ELEMENT(PageIndex));
 
     /* Zero it, if needed */
diff --git a/ntoskrnl/mm/balance.c b/ntoskrnl/mm/balance.c
index a8c9e4c6482..f81027a65cd 100644
--- a/ntoskrnl/mm/balance.c
+++ b/ntoskrnl/mm/balance.c
@@ -303,20 +303,21 @@ MmRequestPageMemoryConsumer(ULONG Consumer, BOOLEAN 
CanWait,
 {
     PFN_NUMBER Page;
 
-    /* Update the target */
-    InterlockedIncrementUL(&MiMemoryConsumers[Consumer].PagesUsed);
-    UpdateTotalCommittedPages(1);
-
     /*
      * Actually allocate the page.
      */
     Page = MmAllocPage(Consumer);
     if (Page == 0)
     {
-        KeBugCheck(NO_PAGES_AVAILABLE);
+        *AllocatedPage = 0;
+        return STATUS_NO_MEMORY;
     }
     *AllocatedPage = Page;
 
+    /* Update the target */
+    InterlockedIncrementUL(&MiMemoryConsumers[Consumer].PagesUsed);
+    UpdateTotalCommittedPages(1);
+
     return(STATUS_SUCCESS);
 }
 
diff --git a/ntoskrnl/mm/freelist.c b/ntoskrnl/mm/freelist.c
index e3b2f30f9fa..95d73eb3cd4 100644
--- a/ntoskrnl/mm/freelist.c
+++ b/ntoskrnl/mm/freelist.c
@@ -623,7 +623,8 @@ MmAllocPage(ULONG Type)
     PfnOffset = MiRemoveZeroPage(MI_GET_NEXT_COLOR());
     if (!PfnOffset)
     {
-        KeBugCheck(NO_PAGES_AVAILABLE);
+        MiReleasePfnLock(OldIrql);
+        return 0;
     }
 
     DPRINT("Legacy allocate: %lx\n", PfnOffset);

Reply via email to