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

commit a8b57f0a6ba6061ce810290b7d8e64ac5b73e7f3
Author:     Timo Kreuzer <timo.kreu...@reactos.org>
AuthorDate: Mon Oct 9 22:01:56 2023 +0300
Commit:     Timo Kreuzer <timo.kreu...@reactos.org>
CommitDate: Tue Oct 24 21:45:27 2023 +0300

    [NTOS:MM] Fix address space locking in MiProtectVirtualMemory
---
 ntoskrnl/mm/ARM3/virtual.c | 24 ++++++++++++++----------
 1 file changed, 14 insertions(+), 10 deletions(-)

diff --git a/ntoskrnl/mm/ARM3/virtual.c b/ntoskrnl/mm/ARM3/virtual.c
index e0804520435..ec081c8110d 100644
--- a/ntoskrnl/mm/ARM3/virtual.c
+++ b/ntoskrnl/mm/ARM3/virtual.c
@@ -2213,6 +2213,9 @@ MiProtectVirtualMemory(IN PEPROCESS Process,
     PETHREAD Thread = PsGetCurrentThread();
     TABLE_SEARCH_RESULT Result;
 
+    /* We must be attached */
+    ASSERT(Process == PsGetCurrentProcess());
+
     /* Calculate base address for the VAD */
     StartingAddress = (ULONG_PTR)PAGE_ALIGN((*BaseAddress));
     EndingAddress = (((ULONG_PTR)*BaseAddress + *NumberOfBytesToProtect - 1) | 
(PAGE_SIZE - 1));
@@ -2225,11 +2228,22 @@ MiProtectVirtualMemory(IN PEPROCESS Process,
         return STATUS_INVALID_PAGE_PROTECTION;
     }
 
+    /* Lock the address space and make sure the process isn't already dead */
+    AddressSpace = MmGetCurrentAddressSpace();
+    MmLockAddressSpace(AddressSpace);
+    if (Process->VmDeleted)
+    {
+        DPRINT1("Process is dying\n");
+        Status = STATUS_PROCESS_IS_TERMINATING;
+        goto FailPath;
+    }
+
     /* Check for ROS specific memory area */
     MemoryArea = MmLocateMemoryAreaByAddress(&Process->Vm, *BaseAddress);
     if ((MemoryArea) && (MemoryArea->Type != MEMORY_AREA_OWNED_BY_ARM3))
     {
         /* Evil hack */
+        MmUnlockAddressSpace(AddressSpace);
         return MiRosProtectVirtualMemory(Process,
                                          BaseAddress,
                                          NumberOfBytesToProtect,
@@ -2237,16 +2251,6 @@ MiProtectVirtualMemory(IN PEPROCESS Process,
                                          OldAccessProtection);
     }
 
-    /* Lock the address space and make sure the process isn't already dead */
-    AddressSpace = MmGetCurrentAddressSpace();
-    MmLockAddressSpace(AddressSpace);
-    if (Process->VmDeleted)
-    {
-        DPRINT1("Process is dying\n");
-        Status = STATUS_PROCESS_IS_TERMINATING;
-        goto FailPath;
-    }
-
     /* Get the VAD for this address range, and make sure it exists */
     Result = MiCheckForConflictingNode(StartingAddress >> PAGE_SHIFT,
                                        EndingAddress >> PAGE_SHIFT,

Reply via email to