Piotr Caban : msvcrt: Terminate on noexcept function trying to propagate exception (x86_64).

Alexandre Julliard julliard at winehq.org
Mon Oct 5 15:54:56 CDT 2020


Module: wine
Branch: master
Commit: 8468a3ed77ba22d9a33b2251240e2a4e5462e1b7
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=8468a3ed77ba22d9a33b2251240e2a4e5462e1b7

Author: Piotr Caban <piotr at codeweavers.com>
Date:   Fri Oct  2 22:27:20 2020 +0200

msvcrt: Terminate on noexcept function trying to propagate exception (x86_64).

Signed-off-by: Piotr Caban <piotr at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/msvcrt/except_x86_64.c | 19 ++++++++++++++++++-
 1 file changed, 18 insertions(+), 1 deletion(-)

diff --git a/dlls/msvcrt/except_x86_64.c b/dlls/msvcrt/except_x86_64.c
index 42283131e8..b7e77f7949 100644
--- a/dlls/msvcrt/except_x86_64.c
+++ b/dlls/msvcrt/except_x86_64.c
@@ -499,6 +499,18 @@ static LONG CALLBACK se_translation_filter(EXCEPTION_POINTERS *ep, void *c)
     return ExceptionContinueSearch;
 }
 
+static void check_noexcept( PEXCEPTION_RECORD rec,
+        const cxx_function_descr *descr, BOOL nested )
+{
+    if (!nested && rec->ExceptionCode == CXX_EXCEPTION &&
+            descr->magic >= CXX_FRAME_MAGIC_VC8 &&
+            (descr->flags & FUNC_DESCR_NOEXCEPT))
+    {
+        ERR("noexcept function propagating exception\n");
+        MSVCRT_terminate();
+    }
+}
+
 static DWORD cxx_frame_handler(EXCEPTION_RECORD *rec, ULONG64 frame,
                                CONTEXT *context, DISPATCHER_CONTEXT *dispatch,
                                const cxx_function_descr *descr)
@@ -562,7 +574,11 @@ static DWORD cxx_frame_handler(EXCEPTION_RECORD *rec, ULONG64 frame,
             cxx_local_unwind(orig_frame, dispatch, descr, unwindlevel);
         return ExceptionContinueSearch;
     }
-    if (!descr->tryblock_count) return ExceptionContinueSearch;
+    if (!descr->tryblock_count)
+    {
+        check_noexcept(rec, descr, orig_frame != frame);
+        return ExceptionContinueSearch;
+    }
 
     if (rec->ExceptionCode == CXX_EXCEPTION)
     {
@@ -612,6 +628,7 @@ static DWORD cxx_frame_handler(EXCEPTION_RECORD *rec, ULONG64 frame,
     }
 
     find_catch_block(rec, context, NULL, frame, dispatch, descr, exc_type, orig_frame);
+    check_noexcept(rec, descr, orig_frame != frame);
     return ExceptionContinueSearch;
 }
 




More information about the wine-cvs mailing list