Module: wine Branch: master Commit: 9476071fd2aaf0022619d428c18ae5f53762f12f URL: http://source.winehq.org/git/wine.git/?a=commit;h=9476071fd2aaf0022619d428c1...
Author: Michael Karcher wine@mkarcher.dialup.fu-berlin.de Date: Tue Aug 18 01:20:53 2009 +0200
ntdll: Don't send EXCEPTION_EXECUTE_FAULT to Windows programs that didn't enable DEP.
---
dlls/ntdll/signal_i386.c | 9 +++++++++ dlls/ntdll/tests/exception.c | 6 +----- 2 files changed, 10 insertions(+), 5 deletions(-)
diff --git a/dlls/ntdll/signal_i386.c b/dlls/ntdll/signal_i386.c index d0e0172..3d7c8e1 100644 --- a/dlls/ntdll/signal_i386.c +++ b/dlls/ntdll/signal_i386.c @@ -1833,6 +1833,15 @@ static void segv_handler( int signal, siginfo_t *siginfo, void *sigcontext ) rec->ExceptionCode = EXCEPTION_ACCESS_VIOLATION; rec->NumberParameters = 2; rec->ExceptionInformation[0] = (get_error_code(context) >> 1) & 0x09; + /* Send code 8 (EXCEPTION_EXECUTE_FAULT) only if data execution + prevention is enabled */ + if (rec->ExceptionInformation[0] & 8) + { + ULONG flags; + NtQueryInformationProcess( GetCurrentProcess(), ProcessExecuteFlags, + &flags, sizeof(flags), NULL ); + if (!(flags & MEM_EXECUTE_OPTION_DISABLE)) rec->ExceptionInformation[0] &= 1; + } rec->ExceptionInformation[1] = (ULONG_PTR)siginfo->si_addr; break; case TRAP_x86_ALIGNFLT: /* Alignment check exception */ diff --git a/dlls/ntdll/tests/exception.c b/dlls/ntdll/tests/exception.c index d0b85f6..f3f61e3 100644 --- a/dlls/ntdll/tests/exception.c +++ b/dlls/ntdll/tests/exception.c @@ -1053,11 +1053,7 @@ static void test_dpe_exceptions(void) info.exception_caught = FALSE; run_exception_test(dpe_exception_handler, &info, single_ret, sizeof(single_ret), PAGE_NOACCESS); ok(info.exception_caught == TRUE, "Execution of disabled memory suceeded\n"); - if(has_hw_support) - todo_wine ok(info.exception_info == EXCEPTION_READ_FAULT, - "Access violation type: %08x\n", (unsigned)info.exception_info); - else - ok(info.exception_info == EXCEPTION_READ_FAULT, + ok(info.exception_info == EXCEPTION_READ_FAULT, "Access violation type: %08x\n", (unsigned)info.exception_info); } else