Alexandre Julliard : ntdll: Remap EXCEPTION_EXECUTE_FAULT only after the internal handlers have been run .
Alexandre Julliard
julliard at winehq.org
Wed Sep 23 11:03:17 CDT 2009
Module: wine
Branch: master
Commit: 9585bf6700be3af3228ebd5be7564fc28b9113be
URL: http://source.winehq.org/git/wine.git/?a=commit;h=9585bf6700be3af3228ebd5be7564fc28b9113be
Author: Alexandre Julliard <julliard at winehq.org>
Date: Wed Sep 23 14:20:17 2009 +0200
ntdll: Remap EXCEPTION_EXECUTE_FAULT only after the internal handlers have been run.
---
dlls/ntdll/signal_i386.c | 18 +++++++++---------
1 files changed, 9 insertions(+), 9 deletions(-)
diff --git a/dlls/ntdll/signal_i386.c b/dlls/ntdll/signal_i386.c
index f70448a..e426388 100644
--- a/dlls/ntdll/signal_i386.c
+++ b/dlls/ntdll/signal_i386.c
@@ -1657,6 +1657,15 @@ static void WINAPI raise_segv_exception( EXCEPTION_RECORD *rec, CONTEXT *context
if (!(rec->ExceptionCode = virtual_handle_fault( (void *)rec->ExceptionInformation[1],
rec->ExceptionInformation[0] )))
goto done;
+ /* send EXCEPTION_EXECUTE_FAULT only if data execution prevention is enabled */
+ if (rec->ExceptionInformation[0] == EXCEPTION_EXECUTE_FAULT)
+ {
+ ULONG flags;
+ NtQueryInformationProcess( GetCurrentProcess(), ProcessExecuteFlags,
+ &flags, sizeof(flags), NULL );
+ if (!(flags & MEM_EXECUTE_OPTION_DISABLE))
+ rec->ExceptionInformation[0] = EXCEPTION_READ_FAULT;
+ }
}
break;
case EXCEPTION_DATATYPE_MISALIGNMENT:
@@ -1833,15 +1842,6 @@ 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 */
More information about the wine-cvs
mailing list