From 9585bf6700be3af3228ebd5be7564fc28b9113be Mon Sep 17 00:00:00 2001 From: Alexandre Julliard Date: Wed, 23 Sep 2009 14:20:17 +0200 Subject: [PATCH] ntdll: Remap EXCEPTION_EXECUTE_FAULT only after the internal handlers have been run. --- dlls/ntdll/signal_i386.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/dlls/ntdll/signal_i386.c b/dlls/ntdll/signal_i386.c index f70448a7754..e426388e324 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 */