Dmitry Timoshkov : ntdll: NtAllocateVirtualMemory should fail to commit if an address range is already committed for a memory mapped file .

Alexandre Julliard julliard at winehq.org
Fri Jul 19 13:19:41 CDT 2013


Module: wine
Branch: master
Commit: 3d759a0c69732721fab2881e484bf716c196dfe3
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=3d759a0c69732721fab2881e484bf716c196dfe3

Author: Dmitry Timoshkov <dmitry at baikal.ru>
Date:   Fri Jul 19 14:01:16 2013 +0900

ntdll: NtAllocateVirtualMemory should fail to commit if an address range is already committed for a memory mapped file.

---

 dlls/kernel32/tests/loader.c  |   16 +++++++++-------
 dlls/kernel32/tests/virtual.c |   14 ++++++--------
 dlls/ntdll/virtual.c          |    1 +
 3 files changed, 16 insertions(+), 15 deletions(-)

diff --git a/dlls/kernel32/tests/loader.c b/dlls/kernel32/tests/loader.c
index ef1cde4..0018d67 100644
--- a/dlls/kernel32/tests/loader.c
+++ b/dlls/kernel32/tests/loader.c
@@ -396,12 +396,13 @@ static void test_Loader(void)
 
             SetLastError(0xdeadbeef);
             ptr = VirtualAlloc(hlib, si.dwPageSize, MEM_COMMIT, info.Protect);
-            /* FIXME: Remove once Wine is fixed */
-            if (ptr) todo_wine
             ok(!ptr, "%d: VirtualAlloc should fail\n", i);
-            else ok(!ptr, "%d: VirtualAlloc should fail\n", i);
+            /* FIXME: Remove once Wine is fixed */
+            if (info.Protect == PAGE_WRITECOPY || info.Protect == PAGE_EXECUTE_WRITECOPY)
 todo_wine
             ok(GetLastError() == ERROR_ACCESS_DENIED, "%d: expected ERROR_ACCESS_DENIED, got %d\n", i, GetLastError());
+            else
+            ok(GetLastError() == ERROR_ACCESS_DENIED, "%d: expected ERROR_ACCESS_DENIED, got %d\n", i, GetLastError());
 
             SetLastError(0xdeadbeef);
             size = VirtualQuery((char *)hlib + info.RegionSize, &info, sizeof(info));
@@ -484,14 +485,15 @@ todo_wine
 
                 SetLastError(0xdeadbeef);
                 ptr = VirtualAlloc((char *)hlib + section.VirtualAddress, si.dwPageSize, MEM_COMMIT, info.Protect);
-                /* FIXME: Remove once Wine is fixed */
-                if (ptr) todo_wine
                 ok(!ptr, "%d: VirtualAlloc should fail\n", i);
-                else ok(!ptr, "%d: VirtualAlloc should fail\n", i);
+                /* FIXME: Remove once Wine is fixed */
+                if (info.Protect == PAGE_WRITECOPY || info.Protect == PAGE_EXECUTE_WRITECOPY)
 todo_wine
                 ok(GetLastError() == ERROR_ACCESS_DENIED || GetLastError() == ERROR_INVALID_ADDRESS,
                    "%d: expected ERROR_ACCESS_DENIED, got %d\n", i, GetLastError());
-
+                else
+                ok(GetLastError() == ERROR_ACCESS_DENIED || GetLastError() == ERROR_INVALID_ADDRESS,
+                   "%d: expected ERROR_ACCESS_DENIED, got %d\n", i, GetLastError());
             }
 
             SetLastError(0xdeadbeef);
diff --git a/dlls/kernel32/tests/virtual.c b/dlls/kernel32/tests/virtual.c
index e605242..99d3286 100644
--- a/dlls/kernel32/tests/virtual.c
+++ b/dlls/kernel32/tests/virtual.c
@@ -1923,14 +1923,13 @@ static void test_CreateFileMapping_protection(void)
 
             SetLastError(0xdeadbeef);
             ptr = VirtualAlloc(base, si.dwPageSize, MEM_COMMIT, td[i].prot);
+            ok(!ptr, "%d: VirtualAlloc(%02x) should fail\n", i, td[i].prot);
             /* FIXME: remove once Wine is fixed */
             if (td[i].prot == PAGE_WRITECOPY || td[i].prot == PAGE_EXECUTE_WRITECOPY)
-            ok(!ptr, "%d: VirtualAlloc(%02x) should fail\n", i, td[i].prot);
-            else
-todo_wine
-            ok(!ptr, "%d: VirtualAlloc(%02x) should fail\n", i, td[i].prot);
 todo_wine
             ok(GetLastError() == ERROR_ACCESS_DENIED, "%d: expected ERROR_ACCESS_DENIED, got %d\n", i, GetLastError());
+            else
+            ok(GetLastError() == ERROR_ACCESS_DENIED, "%d: expected ERROR_ACCESS_DENIED, got %d\n", i, GetLastError());
 
             SetLastError(0xdeadbeef);
             ret = VirtualProtect(base, si.dwPageSize, td[i].prot, &old_prot);
@@ -2427,14 +2426,13 @@ static void test_mapping(void)
                 /*trace("map %#x, view %#x, requested prot %#x\n", page_prot[i], view[j].prot, page_prot[k]);*/
                 SetLastError(0xdeadbeef);
                 ptr = VirtualAlloc(base, si.dwPageSize, MEM_COMMIT, page_prot[k]);
+                ok(!ptr, "VirtualAlloc(%02x) should fail\n", page_prot[k]);
                 /* FIXME: remove once Wine is fixed */
                 if (page_prot[k] == PAGE_WRITECOPY || page_prot[k] == PAGE_EXECUTE_WRITECOPY)
-                ok(!ptr, "VirtualAlloc(%02x) should fail\n", page_prot[k]);
-                else
-todo_wine
-                ok(!ptr, "VirtualAlloc(%02x) should fail\n", page_prot[k]);
 todo_wine
                 ok(GetLastError() == ERROR_ACCESS_DENIED, "expected ERROR_ACCESS_DENIED, got %d\n", GetLastError());
+                else
+                ok(GetLastError() == ERROR_ACCESS_DENIED, "expected ERROR_ACCESS_DENIED, got %d\n", GetLastError());
             }
 
             UnmapViewOfFile(base);
diff --git a/dlls/ntdll/virtual.c b/dlls/ntdll/virtual.c
index 121071f..3ae1f48 100644
--- a/dlls/ntdll/virtual.c
+++ b/dlls/ntdll/virtual.c
@@ -1974,6 +1974,7 @@ NTSTATUS WINAPI NtAllocateVirtualMemory( HANDLE process, PVOID *ret, ULONG zero_
     else  /* commit the pages */
     {
         if (!(view = VIRTUAL_FindView( base, size ))) status = STATUS_NOT_MAPPED_VIEW;
+        else if (view->mapping && (view->protect & VPROT_COMMITTED)) status = STATUS_ALREADY_COMMITTED;
         else if (!VIRTUAL_SetProt( view, base, size, vprot )) status = STATUS_ACCESS_DENIED;
         else if (view->mapping && !(view->protect & VPROT_COMMITTED))
         {




More information about the wine-cvs mailing list