Author: jgardou Date: Sun Aug 28 21:07:51 2016 New Revision: 72497
URL: http://svn.reactos.org/svn/reactos?rev=72497&view=rev Log: [NTOS/MM] - Shuffle parameter chacks in NtMapViewOfSection to make kmtest pass more of them - Restore previously lost check on ZeroBits against 21. Use the architecture specific define - Better check for ZeroBits and ViewSize
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] Sun Aug 28 21:07:51 2016 @@ -3550,14 +3550,40 @@ } _SEH2_END;
+ /* Check for kernel-mode address */ + if (SafeBaseAddress > MM_HIGHEST_VAD_ADDRESS) + { + DPRINT1("Kernel base not allowed\n"); + return STATUS_INVALID_PARAMETER_3; + } + + /* Check for range entering kernel-mode */ + if (((ULONG_PTR)MM_HIGHEST_VAD_ADDRESS - (ULONG_PTR)SafeBaseAddress) < SafeViewSize) + { + DPRINT1("Overflowing into kernel base not allowed\n"); + return STATUS_INVALID_PARAMETER_3; + } + /* Check for invalid zero bits */ - if (ZeroBits && SafeBaseAddress) - { - if ((((ULONG_PTR)SafeBaseAddress << ZeroBits) >> ZeroBits) != (ULONG_PTR)SafeBaseAddress) + if (ZeroBits) + { + if (ZeroBits > MI_MAX_ZERO_BITS) { DPRINT1("Invalid zero bits\n"); return STATUS_INVALID_PARAMETER_4; } + + if ((((ULONG_PTR)SafeBaseAddress << ZeroBits) >> ZeroBits) != (ULONG_PTR)SafeBaseAddress) + { + DPRINT1("Invalid zero bits\n"); + return STATUS_INVALID_PARAMETER_4; + } + + if (((((ULONG_PTR)SafeBaseAddress + SafeViewSize) << ZeroBits) >> ZeroBits) != ((ULONG_PTR)SafeBaseAddress + SafeViewSize)) + { + DPRINT1("Invalid zero bits\n"); + return STATUS_INVALID_PARAMETER_4; + } }
if (!(AllocationType & MEM_DOS_LIM)) @@ -3575,27 +3601,6 @@ DPRINT("SectionOffset is not at 64-kilobyte address boundary."); return STATUS_MAPPED_ALIGNMENT; } - } - - /* Check for kernel-mode address */ - if (SafeBaseAddress > MM_HIGHEST_VAD_ADDRESS) - { - DPRINT1("Kernel base not allowed\n"); - return STATUS_INVALID_PARAMETER_3; - } - - /* Check for range entering kernel-mode */ - if (((ULONG_PTR)MM_HIGHEST_VAD_ADDRESS - (ULONG_PTR)SafeBaseAddress) < SafeViewSize) - { - DPRINT1("Overflowing into kernel base not allowed\n"); - return STATUS_INVALID_PARAMETER_3; - } - - /* Check for invalid zero bits */ - if (((ULONG_PTR)SafeBaseAddress + SafeViewSize) > (0xFFFFFFFF >> ZeroBits)) // arch? - { - DPRINT1("Invalid zero bits\n"); - return STATUS_INVALID_PARAMETER_4; }
/* Reference the process */