Module: wine Branch: master Commit: 9e6971590000dcc9d4b7ed9e69d51bb340cf5412 URL: http://source.winehq.org/git/wine.git/?a=commit;h=9e6971590000dcc9d4b7ed9e69...
Author: Michael Müller michael@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;