https://git.reactos.org/?p=reactos.git;a=commitdiff;h=4ddc66f224d96fb481aa8c1cf9a223b94d631e55

commit 4ddc66f224d96fb481aa8c1cf9a223b94d631e55
Author:     Jérôme Gardou <[email protected]>
AuthorDate: Thu May 27 19:17:13 2021 +0200
Commit:     Jérôme Gardou <[email protected]>
CommitDate: Mon Jun 7 17:04:18 2021 +0200

    [NTOS:MM] Make MI_MAKE_HARDWARE_PTE_KERNEL actually respect the protection 
it is given
    
    This one would set a page as writable & dirty even if MM_READONLY was passed
    CORE-17587
---
 ntoskrnl/mm/ARM3/miarm.h | 22 ++++++++++++++++++++--
 1 file changed, 20 insertions(+), 2 deletions(-)

diff --git a/ntoskrnl/mm/ARM3/miarm.h b/ntoskrnl/mm/ARM3/miarm.h
index 730acdd8bf1..a784d08e15f 100644
--- a/ntoskrnl/mm/ARM3/miarm.h
+++ b/ntoskrnl/mm/ARM3/miarm.h
@@ -790,12 +790,23 @@ MI_MAKE_HARDWARE_PTE_KERNEL(IN PMMPTE NewPte,
     ASSERT(!MI_IS_SESSION_PTE(MappingPte));
     ASSERT((MappingPte < (PMMPTE)PDE_BASE) || (MappingPte > (PMMPTE)PDE_TOP));
 
+    /* Check that we are not setting valid a page that should not be */
+    ASSERT(ProtectionMask & MM_PROTECT_ACCESS);
+    ASSERT((ProtectionMask & MM_GUARDPAGE) == 0);
+
     /* Start fresh */
-    *NewPte = ValidKernelPte;
+    NewPte->u.Long = 0;
 
     /* Set the protection and page */
     NewPte->u.Hard.PageFrameNumber = PageFrameNumber;
     NewPte->u.Long |= MmProtectToPteMask[ProtectionMask];
+
+    /* Make this valid & global */
+#ifdef _GLOBAL_PAGES_ARE_AWESOME_
+    if (KeFeatureBits & KF_GLOBAL_PAGE)
+        NewPte->u.Hard.Global = 1;
+#endif
+    NewPte->u.Hard.Valid = 1;
 }
 
 //
@@ -808,6 +819,10 @@ MI_MAKE_HARDWARE_PTE(IN PMMPTE NewPte,
                      IN ULONG_PTR ProtectionMask,
                      IN PFN_NUMBER PageFrameNumber)
 {
+    /* Check that we are not setting valid a page that should not be */
+    ASSERT(ProtectionMask & MM_PROTECT_ACCESS);
+    ASSERT((ProtectionMask & MM_GUARDPAGE) == 0);
+
     /* Set the protection and page */
     NewPte->u.Long = MiDetermineUserGlobalPteMask(MappingPte);
     NewPte->u.Long |= MmProtectToPteMask[ProtectionMask];
@@ -830,7 +845,10 @@ MI_MAKE_HARDWARE_PTE_USER(IN PMMPTE NewPte,
     /* Start fresh */
     NewPte->u.Long = 0;
 
-    /* Set the protection and page */
+    /* Check that we are not setting valid a page that should not be */
+    ASSERT(ProtectionMask & MM_PROTECT_ACCESS);
+    ASSERT((ProtectionMask & MM_GUARDPAGE) == 0);
+
     NewPte->u.Hard.Valid = TRUE;
     NewPte->u.Hard.Owner = TRUE;
     NewPte->u.Hard.PageFrameNumber = PageFrameNumber;

Reply via email to