Author: tfaber
Date: Tue May 2 11:11:39 2017
New Revision: 74447
URL:
http://svn.reactos.org/svn/reactos?rev=74447&view=rev
Log:
[NTOS:MM]
- When mapping a view of the physical memory section, don't check for
BaseAddress/SectionOffset alignment. Instead, prevent user mode mappings of views beyond
the highest physical page. Fixes flakiness in kmtest:MmSection
CORE-13113 #resolve
Modified:
trunk/reactos/ntoskrnl/mm/ARM3/section.c
Modified: trunk/reactos/ntoskrnl/mm/ARM3/section.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/mm/ARM3/section.c…
==============================================================================
--- trunk/reactos/ntoskrnl/mm/ARM3/section.c [iso-8859-1] (original)
+++ trunk/reactos/ntoskrnl/mm/ARM3/section.c [iso-8859-1] Tue May 2 11:11:39 2017
@@ -3689,24 +3689,36 @@
return Status;
}
- if (!(AllocationType & MEM_DOS_LIM))
+ if (MiIsRosSectionObject(Section) &&
+ (Section->AllocationAttributes & SEC_PHYSICALMEMORY))
+ {
+ if (PreviousMode == UserMode &&
+ SafeSectionOffset.QuadPart + SafeViewSize > MmHighestPhysicalPage <<
PAGE_SHIFT)
+ {
+ DPRINT1("Denying map past highest physical page.\n");
+ ObDereferenceObject(Section);
+ ObDereferenceObject(Process);
+ return STATUS_INVALID_PARAMETER_6;
+ }
+ }
+ else if (!(AllocationType & MEM_DOS_LIM))
{
/* Check for non-allocation-granularity-aligned BaseAddress */
if (SafeBaseAddress != ALIGN_DOWN_POINTER_BY(SafeBaseAddress,
MM_VIRTMEM_GRANULARITY))
{
- DPRINT("BaseAddress is not at 64-kilobyte address boundary.");
- ObDereferenceObject(Section);
- ObDereferenceObject(Process);
- return STATUS_MAPPED_ALIGNMENT;
+ DPRINT("BaseAddress is not at 64-kilobyte address boundary.\n");
+ ObDereferenceObject(Section);
+ ObDereferenceObject(Process);
+ return STATUS_MAPPED_ALIGNMENT;
}
/* Do the same for the section offset */
if (SafeSectionOffset.LowPart != ALIGN_DOWN_BY(SafeSectionOffset.LowPart,
MM_VIRTMEM_GRANULARITY))
{
- DPRINT("SectionOffset is not at 64-kilobyte address boundary.");
- ObDereferenceObject(Section);
- ObDereferenceObject(Process);
- return STATUS_MAPPED_ALIGNMENT;
+ DPRINT("SectionOffset is not at 64-kilobyte address boundary.\n");
+ ObDereferenceObject(Section);
+ ObDereferenceObject(Process);
+ return STATUS_MAPPED_ALIGNMENT;
}
}