Peter Beutner : msvcrt: Save esp before calling catch block and restore afterwards.

Alexandre Julliard julliard at wine.codeweavers.com
Wed Feb 22 05:44:11 CST 2006


Module: wine
Branch: refs/heads/master
Commit: 82818284c3a227fdbd894e626b887f5bb6b3addc
URL:    http://source.winehq.org/git/?p=wine.git;a=commit;h=82818284c3a227fdbd894e626b887f5bb6b3addc

Author: Peter Beutner <p.beutner at gmx.net>
Date:   Wed Feb 22 12:21:00 2006 +0100

msvcrt: Save esp before calling catch block and restore afterwards.
It seems like the esp value (which is saved at [ebp-16]) is sometimes
changed inside the catch handler so we end up with a bogus esp
afterwards.  To avoid that save it before calling the catch block.

---

 dlls/msvcrt/cppexcept.c |    2 ++
 1 files changed, 2 insertions(+), 0 deletions(-)

diff --git a/dlls/msvcrt/cppexcept.c b/dlls/msvcrt/cppexcept.c
index 3f28166..da7b0fb 100644
--- a/dlls/msvcrt/cppexcept.c
+++ b/dlls/msvcrt/cppexcept.c
@@ -285,6 +285,7 @@ inline static void call_catch_block( PEX
     struct catch_func_nested_frame nested_frame;
     int trylevel = frame->trylevel;
     thread_data_t *thread_data = msvcrt_get_thread_data();
+    DWORD save_esp = ((DWORD*)frame)[-1];
 
     for (i = 0; i < descr->tryblock_count; i++)
     {
@@ -339,6 +340,7 @@ inline static void call_catch_block( PEX
             thread_data->exc_record = nested_frame.prev_rec;
             __wine_pop_frame( &nested_frame.frame );
 
+            ((DWORD*)frame)[-1] = save_esp;
             if (info && info->destructor) call_dtor( info->destructor, object );
             TRACE( "done, continuing at %p\n", addr );
 




More information about the wine-cvs mailing list