From 9e6971590000dcc9d4b7ed9e69d51bb340cf5412 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Michael=20M=C3=BCller?= Date: Sat, 4 Oct 2014 02:48:16 +0200 Subject: [PATCH] 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 af0e6b4b4d5..0fa2b991204 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 4819d2d97a6..f8a5dd3f49c 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; -- 2.11.4.GIT