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