Robert Shearman : ntdll: Avoid crashing in check_atl_thunk if an execution exception was raised with a bad address .

Alexandre Julliard julliard at wine.codeweavers.com
Thu Sep 28 05:26:48 CDT 2006


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

Author: Robert Shearman <rob at codeweavers.com>
Date:   Wed Sep 27 15:51:07 2006 +0100

ntdll: Avoid crashing in check_atl_thunk if an execution exception was raised with a bad address.

---

 dlls/ntdll/signal_i386.c |   26 +++++++++++++++++++-------
 1 files changed, 19 insertions(+), 7 deletions(-)

diff --git a/dlls/ntdll/signal_i386.c b/dlls/ntdll/signal_i386.c
index 44f47ec..9a8f197 100644
--- a/dlls/ntdll/signal_i386.c
+++ b/dlls/ntdll/signal_i386.c
@@ -828,14 +828,26 @@ #include "poppack.h"
  */
 static BOOL check_atl_thunk( EXCEPTION_RECORD *rec, CONTEXT *context )
 {
-    struct atl_thunk *thunk = (struct atl_thunk *)rec->ExceptionInformation[1];
+    const struct atl_thunk *thunk = (const struct atl_thunk *)rec->ExceptionInformation[1];
+    BOOL ret = FALSE;
 
-    if (thunk->movl != 0x042444c7 || thunk->jmp != 0xe9) return FALSE;
-    *((DWORD *)context->Esp + 1) = thunk->this;
-    context->Eip = (DWORD_PTR)(&thunk->func + 1) + thunk->func;
-    TRACE( "emulating ATL thunk at %p, func=%08lx arg=%08lx\n",
-           thunk, context->Eip, *((DWORD *)context->Esp + 1) );
-    return TRUE;
+    __TRY
+    {
+        if (thunk->movl == 0x042444c7 && thunk->jmp == 0xe9)
+        {
+            *((DWORD *)context->Esp + 1) = thunk->this;
+            context->Eip = (DWORD_PTR)(&thunk->func + 1) + thunk->func;
+            TRACE( "emulating ATL thunk at %p, func=%08lx arg=%08lx\n",
+                   thunk, context->Eip, *((DWORD *)context->Esp + 1) );
+            ret = TRUE;
+        }
+    }
+    __EXCEPT_PAGE_FAULT
+    {
+        return FALSE;
+    }
+    __ENDTRY
+    return ret;
 }
 
 




More information about the wine-cvs mailing list