From 43c47ac44cbdb00c67cb3ed4c751738602d775ca Mon Sep 17 00:00:00 2001 From: bakpakin Date: Tue, 20 Sep 2022 15:36:03 -0500 Subject: [PATCH] Address #1037 - move stack hack after arg writing logic to avoid clobber. --- examples/ffi/so.c | 1 + src/core/ffi.c | 8 ++++++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/examples/ffi/so.c b/examples/ffi/so.c index 2549ed06..c60a76e1 100644 --- a/examples/ffi/so.c +++ b/examples/ffi/so.c @@ -154,6 +154,7 @@ void void_ret_fn(int x) { EXPORTER int intintint_fn_2(intintint iii, int i) { + fprintf(stderr, "iii.a = %d, iii.b = %d, iii.c = %d, i = %d\n", iii.a, iii.b, iii.c, i); return i * (iii.a + iii.b + iii.c); } diff --git a/src/core/ffi.c b/src/core/ffi.c index c7ba5185..c93c6ec4 100644 --- a/src/core/ffi.c +++ b/src/core/ffi.c @@ -1093,8 +1093,8 @@ static Janet janet_ffi_win64(JanetFFISignature *signature, void *function_pointe ret_mem = alloca(type_size(signature->ret.type)); regs[0].integer = (uint64_t) ret_mem; } - uint64_t *stack = alloca(signature->stack_count * 8); - stack -= 2; /* hack to get proper stack placement */ + size_t stack_size = signature->stack_count * 8; + uint64_t *stack = alloca(stack_size); for (uint32_t i = 0; i < signature->arg_count; i++) { int32_t n = i + 2; JanetFFIMapping arg = signature->args[i]; @@ -1113,6 +1113,10 @@ static Janet janet_ffi_win64(JanetFFISignature *signature, void *function_pointe } } + /* hack to get proper stack placement and avoid clobbering from logic above - shift stack down, otherwise we have issues. + * Technically, this writes into 16 bytes of unallocated stack memory */ + if (stack_size) memmove(stack - 2, stack, stack_size); + switch (signature->variant) { default: janet_panicf("unknown variant %d", signature->variant);