From 51182fc84c921a029e9ad22fc7b9c9a9e313f67a Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Thu, 16 May 2013 00:43:22 -0700 Subject: [PATCH] Fixed bug 1846 - _allmul implementation in SDL_stdlib.c doesn't clean up the stack Colin Barrett I see this manifest itself (VS2012 x86) as: "Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call. This is usually a result of calling a function declared with one calling convention with a function pointer declared with a different calling convention." in the first call to SDL_GetTicks in my application. The disassembly at the problem line is: hires_now.QuadPart *= 1000; 00AD0792 push 0 00AD0794 push 3E8h 00AD0799 mov eax,dword ptr [ebp-10h] 00AD079C push eax 00AD079D mov ecx,dword ptr [hires_now] 00AD07A0 push ecx 00AD07A1 call _allmul (0AE7D40h) 00AD07A6 mov dword ptr [hires_now],eax 00AD07A9 mov dword ptr [ebp-10h],edx Apparently _allmul should be popping the stack but isn't (other similar functions in SDL_stdlib.c - _alldiv and whatnot - DO pop the stack). A 'ret 10h' at the end of _allmul appears to do the trick --- src/stdlib/SDL_stdlib.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/stdlib/SDL_stdlib.c b/src/stdlib/SDL_stdlib.c index 1c19ab72f..176aa240c 100644 --- a/src/stdlib/SDL_stdlib.c +++ b/src/stdlib/SDL_stdlib.c @@ -191,7 +191,7 @@ _allmul() pop esi pop edi pop ebp - ret + ret 10h } /* *INDENT-ON* */ }