Module: wine Branch: refs/heads/master Commit: 82818284c3a227fdbd894e626b887f5bb6b3addc URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=82818284c3a227fdbd894e62...
Author: Peter Beutner p.beutner@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 );