Fixed bug 1846 - _allmul implementation in SDL_stdlib.c doesn't clean up the stack
authorSam Lantinga <slouken@libsdl.org>
Thu, 16 May 2013 00:43:22 -0700
changeset 7180 3733e68edbc3
parent 7179 d6acc2d7f760
child 7181 d35a0936c674
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
--- a/src/stdlib/SDL_stdlib.c	Wed May 15 23:18:29 2013 -0700
+++ b/src/stdlib/SDL_stdlib.c	Thu May 16 00:43:22 2013 -0700
@@ -191,7 +191,7 @@
         pop         esi
         pop         edi
         pop         ebp
-        ret
+        ret         10h
     }
     /* *INDENT-ON* */
 }