From 08b965e485a66fbf87b40357577b5434fad89a52 Mon Sep 17 00:00:00 2001 From: asmodai Date: Wed, 8 Feb 2017 00:49:20 +0300 Subject: [PATCH] Force stack align for callbacks --- metamod/src/callback_jit.cpp | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/metamod/src/callback_jit.cpp b/metamod/src/callback_jit.cpp index d697b05..89bfaae 100644 --- a/metamod/src/callback_jit.cpp +++ b/metamod/src/callback_jit.cpp @@ -51,6 +51,7 @@ void CForwardCallbackJIT::naked_main() push(ebp); mov(ebp, esp); push(ebx); + and_(esp, 0xFFFFFFF0); enum // stack map { @@ -58,22 +59,27 @@ void CForwardCallbackJIT::naked_main() over_ret = 4 }; + auto align = [](size_t v, size_t a) + { + return (v + a - 1) & ~a; + }; + auto globals = ebx; auto mg_backup = m_jitdata->has_ret ? 8 /* orig + over */ : 0; - auto framesize = mg_backup + sizeof(meta_globals_t); + auto framesize = align(mg_backup + sizeof(meta_globals_t) + m_jitdata->args_count * sizeof(int), 16) - m_jitdata->args_count * sizeof(int); if (m_jitdata->has_varargs) { size_t buf_offset = framesize; - sub(esp, framesize += MAX_STRBUF_LEN); + sub(esp, framesize += align(MAX_STRBUF_LEN, 16)); // format varargs - lea(edx, dword_ptr[ebp + 8 + m_jitdata->args_count * 4]); // varargs ptr + lea(edx, dword_ptr[ebp + 8 + m_jitdata->args_count * sizeof(int)]); // varargs ptr lea(eax, dword_ptr[esp + buf_offset]); // buf ptr mov(ecx, size_t(vsnprintf)); push(edx); - push(dword_ptr[ebp + 8 + (m_jitdata->args_count - 1) * 4]); // last arg of pfn (format string) + push(dword_ptr[ebp + 8 + (m_jitdata->args_count - 1) * sizeof(int)]); // last arg of pfn (format string) push(MAX_STRBUF_LEN); push(eax); call(ecx); @@ -254,12 +260,9 @@ void CForwardCallbackJIT::naked_main() cmovz(eax, dword_ptr[esp + over_ret]); } - if (framesize) { - add(esp, framesize); - } - // epilogue pop(ebx); + mov(esp, ebp); pop(ebp); ret(); }