Michael Karcher : ntdll: Don' t send EXCEPTION_EXECUTE_FAULT to Windows programs that didn't enable DEP.

Alexandre Julliard julliard at winehq.org
Tue Aug 18 09:59:57 CDT 2009


Module: wine
Branch: master
Commit: 9476071fd2aaf0022619d428c18ae5f53762f12f
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=9476071fd2aaf0022619d428c18ae5f53762f12f

Author: Michael Karcher <wine at 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




More information about the wine-cvs mailing list