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
This commit is contained in:
Sam Lantinga 2013-05-16 00:43:22 -07:00
parent e8051fbb53
commit 128b8ca895

View file

@ -191,7 +191,7 @@ _allmul()
pop esi
pop edi
pop ebp
ret
ret 10h
}
/* *INDENT-ON* */
}