Piotr Caban : msvcrt: Handle seh exception rethrowing in catch_function_nested_handler.

Alexandre Julliard julliard at winehq.org
Wed Apr 30 13:32:52 CDT 2014


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

Author: Piotr Caban <piotr at codeweavers.com>
Date:   Wed Apr 30 13:50:25 2014 +0200

msvcrt: Handle seh exception rethrowing in catch_function_nested_handler.

---

 dlls/msvcrt/except_i386.c |   23 ++++++++++++++++-------
 1 file changed, 16 insertions(+), 7 deletions(-)

diff --git a/dlls/msvcrt/except_i386.c b/dlls/msvcrt/except_i386.c
index 0481282..7f521cc 100644
--- a/dlls/msvcrt/except_i386.c
+++ b/dlls/msvcrt/except_i386.c
@@ -374,23 +374,28 @@ static DWORD catch_function_nested_handler( EXCEPTION_RECORD *rec, EXCEPTION_REG
     {
         PEXCEPTION_RECORD prev_rec = nested_frame->rec;
         if((rec->ExceptionInformation[1] == 0 && rec->ExceptionInformation[2] == 0) ||
-                (rec->ExceptionInformation[1] == prev_rec->ExceptionInformation[1] &&
+                (prev_rec->ExceptionCode == CXX_EXCEPTION &&
+                 rec->ExceptionInformation[1] == prev_rec->ExceptionInformation[1] &&
                  rec->ExceptionInformation[2] == prev_rec->ExceptionInformation[2]))
         {
             /* exception was rethrown */
-            rec->ExceptionInformation[1] = prev_rec->ExceptionInformation[1];
-            rec->ExceptionInformation[2] = prev_rec->ExceptionInformation[2];
-            TRACE("detect rethrow: re-propagate: obj: %lx, type: %lx\n",
-                    rec->ExceptionInformation[1], rec->ExceptionInformation[2]);
+            *rec = *prev_rec;
+            rec->ExceptionFlags &= ~EH_UNWINDING;
+            if(TRACE_ON(seh)) {
+                TRACE("detect rethrow: exception code: %x\n", rec->ExceptionCode);
+                if(rec->ExceptionCode == CXX_EXCEPTION)
+                    TRACE("re-propage: obj: %lx, type: %lx\n",
+                            rec->ExceptionInformation[1], rec->ExceptionInformation[2]);
+            }
         }
-        else if (nested_frame->prev_rec &&
+        else if (nested_frame->prev_rec && nested_frame->prev_rec->ExceptionCode == CXX_EXCEPTION &&
                 nested_frame->prev_rec->ExceptionInformation[1] == prev_rec->ExceptionInformation[1] &&
                 nested_frame->prev_rec->ExceptionInformation[2] == prev_rec->ExceptionInformation[2])
         {
             TRACE("detect threw new exception in catch block - not owning old(obj: %lx type: %lx)\n",
                     prev_rec->ExceptionInformation[1], prev_rec->ExceptionInformation[2]);
         }
-        else {
+        else if (prev_rec->ExceptionCode == CXX_EXCEPTION) {
             /* new exception in exception handler, destroy old */
             void *object = (void*)prev_rec->ExceptionInformation[1];
             cxx_exception_type *info = (cxx_exception_type*) prev_rec->ExceptionInformation[2];
@@ -399,6 +404,10 @@ static DWORD catch_function_nested_handler( EXCEPTION_RECORD *rec, EXCEPTION_REG
             if(info && info->destructor)
                 call_dtor( info->destructor, object );
         }
+        else
+        {
+            TRACE("detect threw new exception in catch block\n");
+        }
     }
 
     return cxx_frame_handler( rec, nested_frame->cxx_frame, context,




More information about the wine-cvs mailing list