From b8fb59e558f58ecc109185cf471dea565b88fe4d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E7=9A=93?= Date: Tue, 20 May 2025 15:51:50 -0400 Subject: [PATCH] Make sure `stack_index` is initialized in binding-sandbox/binding-base.h This field needs to be initialized when `struct frame` is constructed, or its value may be random. I also changed the type of `stack_index` to `wasm_size_t` so that it's the same size on every platform. --- binding-sandbox/binding-base.cpp | 1 - binding-sandbox/binding-base.h | 12 +++++++++--- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/binding-sandbox/binding-base.cpp b/binding-sandbox/binding-base.cpp index c87c9d9c..730a3038 100644 --- a/binding-sandbox/binding-base.cpp +++ b/binding-sandbox/binding-base.cpp @@ -20,7 +20,6 @@ */ #include "binding-base.h" -#include "mkxp-polyfill.h" using namespace mkxp_sandbox; diff --git a/binding-sandbox/binding-base.h b/binding-sandbox/binding-base.h index dfcd8229..ad1d979a 100644 --- a/binding-sandbox/binding-base.h +++ b/binding-sandbox/binding-base.h @@ -35,6 +35,7 @@ #include #include #include "wasm-types.h" +#include "mkxp-polyfill.h" // LLVM uses a stack alignment of 16 on WebAssembly targets #define WASMSTACKALIGN 16 @@ -221,8 +222,8 @@ namespace mkxp_sandbox { struct fiber { key_t key; + wasm_size_t stack_index; std::vector stack; - size_t stack_index; }; struct object { @@ -326,7 +327,7 @@ namespace mkxp_sandbox { bind.ref(bind.instance().w2c_mkxp_sandbox_fiber_arg1), }; if (bind.fibers.count(key) == 0) { - bind.fibers[key] = (struct fiber){.key = key}; + bind.fibers[key] = (struct fiber){.key = key, .stack_index = 0}; } return bind.fibers[key]; } @@ -352,6 +353,9 @@ namespace mkxp_sandbox { std::abort(); } struct stack_frame &frame = fiber->stack[fiber->stack_index++]; + if (fiber->stack_index == 0) { + MKXPZ_THROW(std::bad_alloc()); + } b.stack_ptr = frame.stack_ptr; coroutine = (T *)frame.coroutine; return; @@ -363,7 +367,9 @@ namespace mkxp_sandbox { bind->stack_ptr = fiber->stack.back().stack_ptr; fiber->stack.pop_back(); } - ++fiber->stack_index; + if (++fiber->stack_index == 0) { + MKXPZ_THROW(std::bad_alloc()); + } b.stack_ptr = w2c_ruby_rb_wasm_get_stack_pointer(&b.instance()) - CEIL_WASMSTACKALIGN(declared_slots_size::value); assert(b.stack_ptr % sizeof(VALUE) == 0); assert(b.stack_ptr % WASMSTACKALIGN == 0);