https://git.reactos.org/?p=reactos.git;a=commitdiff;h=4ddc66f224d96fb481aa8c...
commit 4ddc66f224d96fb481aa8c1cf9a223b94d631e55 Author: Jérôme Gardou jerome.gardou@reactos.org AuthorDate: Thu May 27 19:17:13 2021 +0200 Commit: Jérôme Gardou zefklop@users.noreply.github.com 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;