=?UTF-8?Q?Michael=20M=C3=BCller=20?=: ntdll: Fix handling of page fault if a guard page and write watch is triggered at the same time.

Alexandre Julliard julliard at wine.codeweavers.com
Tue Oct 7 14:49:55 CDT 2014


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

Author: Michael Müller <michael at fds-team.de>
Date:   Sat Oct  4 02:48:16 2014 +0200

ntdll: Fix handling of page fault if a guard page and write watch is triggered at the same time.

---

 dlls/kernel32/tests/virtual.c |  1 -
 dlls/ntdll/virtual.c          | 10 +++++-----
 2 files changed, 5 insertions(+), 6 deletions(-)

diff --git a/dlls/kernel32/tests/virtual.c b/dlls/kernel32/tests/virtual.c
index af0e6b4..0fa2b99 100644
--- a/dlls/kernel32/tests/virtual.c
+++ b/dlls/kernel32/tests/virtual.c
@@ -1728,7 +1728,6 @@ static void test_guard_page(void)
     num_guard_page_calls = 0;
     *value       = 1;
     *(value + 1) = 2;
-    todo_wine
     ok( num_guard_page_calls == 1, "expected one callback of guard page handler, got %d calls\n", num_guard_page_calls );
 
     pNtCurrentTeb()->Tib.ExceptionList = frame.Prev;
diff --git a/dlls/ntdll/virtual.c b/dlls/ntdll/virtual.c
index 4819d2d..f8a5dd3 100644
--- a/dlls/ntdll/virtual.c
+++ b/dlls/ntdll/virtual.c
@@ -1522,11 +1522,6 @@ NTSTATUS virtual_handle_fault( LPCVOID addr, DWORD err )
     {
         void *page = ROUND_ADDR( addr, page_mask );
         BYTE *vprot = &view->prot[((const char *)page - (const char *)view->base) >> page_shift];
-        if (*vprot & VPROT_GUARD)
-        {
-            VIRTUAL_SetProt( view, page, page_size, *vprot & ~VPROT_GUARD );
-            ret = STATUS_GUARD_PAGE_VIOLATION;
-        }
         if ((err & EXCEPTION_WRITE_FAULT) && (view->protect & VPROT_WRITEWATCH))
         {
             if (*vprot & VPROT_WRITEWATCH)
@@ -1537,6 +1532,11 @@ NTSTATUS virtual_handle_fault( LPCVOID addr, DWORD err )
             /* ignore fault if page is writable now */
             if (VIRTUAL_GetUnixProt( *vprot ) & PROT_WRITE) ret = STATUS_SUCCESS;
         }
+        if (*vprot & VPROT_GUARD)
+        {
+            VIRTUAL_SetProt( view, page, page_size, *vprot & ~VPROT_GUARD );
+            ret = STATUS_GUARD_PAGE_VIOLATION;
+        }
     }
     server_leave_uninterrupted_section( &csVirtual, &sigset );
     return ret;




More information about the wine-cvs mailing list