diff --git a/src/ScriptResolving/WASM/InterfaceMethods/WasmHelperFile.hpp b/src/ScriptResolving/WASM/InterfaceMethods/WasmHelperFile.hpp index d3f7653..b86b738 100644 --- a/src/ScriptResolving/WASM/InterfaceMethods/WasmHelperFile.hpp +++ b/src/ScriptResolving/WASM/InterfaceMethods/WasmHelperFile.hpp @@ -68,10 +68,8 @@ public: return f; } - template - inline static T ConvertAllArguments(const wasm_val_vec_t* t, std::size_t& index, - WebAssemblyScriptResolver* resolver) { - return FromVal(t->data[index++], resolver); + template inline static T ConvertAllArguments(const wasm_val_vec_t* t, std::size_t& index) { + return FromVal(t->data[index++]); } template @@ -81,25 +79,28 @@ public: struct Env { WebAssemblyScriptResolver* Resolver; std::function Func; - __attribute__((no_sanitize("address"))) - ~Env(){} + ~Env() {} }; - auto env = new Env{.Resolver = resolver, .Func = func}; + auto env = (Env*)malloc(sizeof(Env)); + new (env) Env{.Resolver = resolver, .Func = func}; + resolver->Temp_WasmerBug2_2_1_Bypass.Append(env); auto* f = wasm_func_new_with_env( store, funcType, [](void* env, const wasm_val_vec_t* parameters, wasm_val_vec_t* results) -> wasm_trap_t* { auto e = *(Env*)env; size_t index = 0; - R result = e.Func(e.Resolver, ConvertAllArguments(parameters, index, e.Resolver)...); - results->data[0] = ToVal(result); + try { + R result = e.Func(e.Resolver, ConvertAllArguments(parameters, index)...); + results->data[0] = ToVal(result); + } catch (ArbUt::Exception& exception) { + return CreateTrapFromException(exception, e.Resolver); + } catch (std::exception& exception) { + return FromStdException(exception, e.Resolver); + } return nullptr; }, - env, - [](void* env) __attribute__((no_sanitize("address"))) { - delete (Env*)env; - } - ); + env, /*[](void*) { delete (Env*)env; }*/ nullptr); wasm_functype_delete(funcType); return f; } @@ -138,16 +139,15 @@ private: return WASM_I32_VAL((i32)val); } } else if constexpr (std::is_same()) { - return WASM_I64_VAL(reinterpret_cast(&val)); + auto v = &val; + return WASM_I64_VAL(reinterpret_cast(v)); } THROW("Unhandled value type: ", typeid(T).name()); } - template inline static T FromVal(const wasm_val_t& val, WebAssemblyScriptResolver* resolver) { + template inline static T FromVal(const wasm_val_t& val) { if constexpr (std::is_pointer()) { - auto v = reinterpret_cast(val.of.i64); - Ensure(resolver->ValidateLoadedPointer>(v)); - return (T)v; + return (T) reinterpret_cast(val.of.i64); } else if constexpr (is_specialization::value) { return dynamic_cast(reinterpret_cast(val.of.i64)); } else if constexpr (is_specialization::value) { diff --git a/src/ScriptResolving/WASM/WebAssemblyFunctionCall.hpp b/src/ScriptResolving/WASM/WebAssemblyFunctionCall.hpp index 5c1d593..ad3dbe1 100644 --- a/src/ScriptResolving/WASM/WebAssemblyFunctionCall.hpp +++ b/src/ScriptResolving/WASM/WebAssemblyFunctionCall.hpp @@ -4,10 +4,8 @@ #include #include #include -#include "wasm.h" -template -class WebAssemblyFunctionCall { +template class WebAssemblyFunctionCall { public: WebAssemblyFunctionCall(const ArbUt::BorrowedPtr& func) : _func(func) {} diff --git a/src/ScriptResolving/WASM/WebAssemblyScriptResolver.cpp b/src/ScriptResolving/WASM/WebAssemblyScriptResolver.cpp index a1af21a..f7eb1e8 100644 --- a/src/ScriptResolving/WASM/WebAssemblyScriptResolver.cpp +++ b/src/ScriptResolving/WASM/WebAssemblyScriptResolver.cpp @@ -18,6 +18,9 @@ WebAssemblyScriptResolver::~WebAssemblyScriptResolver() { for (auto& import : _imports) { wasm_func_delete(import.second); } + for (auto e : Temp_WasmerBug2_2_1_Bypass) { + free(e); + } if (_instance != nullptr) { wasm_instance_delete(_instance); } @@ -153,7 +156,7 @@ WebAssemblyScriptResolver::LoadScript(const ArbUt::OptionalBorrowedPtr& ow if (findCapabilities != _scriptCapabilities.end()) { capabilities = findCapabilities->second; } else { - auto getCapabilitiesOpt = GetFunction<1,2>("get_script_capabilities"_cnc); + auto getCapabilitiesOpt = GetFunction<1, 2>("get_script_capabilities"_cnc); if (getCapabilitiesOpt.has_value()) { auto& getCapabilitiesFunc = getCapabilitiesOpt.value(); getCapabilitiesFunc.Loadi32(0, result); @@ -162,7 +165,7 @@ WebAssemblyScriptResolver::LoadScript(const ArbUt::OptionalBorrowedPtr& ow auto ptr = (WebAssemblyScriptCapabilities*)(wasm_memory_data(_memory) + rawResult[0].of.i32); auto end = (WebAssemblyScriptCapabilities*)(ptr + rawResult[1].of.i32); auto vec = std::vector(ptr, end); - for (auto capability: vec){ + for (auto capability : vec) { capabilities.insert(capability); } } diff --git a/src/ScriptResolving/WASM/WebAssemblyScriptResolver.hpp b/src/ScriptResolving/WASM/WebAssemblyScriptResolver.hpp index 7d19a6e..8761fbb 100644 --- a/src/ScriptResolving/WASM/WebAssemblyScriptResolver.hpp +++ b/src/ScriptResolving/WASM/WebAssemblyScriptResolver.hpp @@ -44,24 +44,18 @@ public: [[nodiscard]] inline wasm_memory_t* GetMemory() const noexcept { return _memory; } - ArbUt::OptionalUniquePtr LoadScript(const ArbUt::OptionalBorrowedPtr& owner, - ScriptCategory category, - const ArbUt::StringView& scriptName) nullable override; + ArbUt::OptionalUniquePtr + LoadScript(const ArbUt::OptionalBorrowedPtr& owner, ScriptCategory category, + const ArbUt::StringView& scriptName) nullable override; [[nodiscard]] inline wasm_store_t* GetStore() const noexcept { return _store; } inline void RemoveRegisteredScript(i32 wasmPtr) { _loadedScripts.Remove(wasmPtr); } - template - inline void MarkLoadedPointer(T* ptr){ - _loadedPointers.Set((void*)ptr, typeid(T)); - } - - template - inline bool ValidateLoadedPointer(void* ptr){ - const auto& opt = _loadedPointers.TryGet(ptr); - return opt.has_value() && opt.value() == typeid(T); - } + // HACK: This is a temporary way to bypass a bug in wasmer 2.2.1. As finalizers on wasm_func_new_with_env are called + // twice, the environment objects of WasmHelpers::CreateFunc are deleted twice. This causes major issues. This + // should be fixed in the next wasmer release. + ArbUt::List Temp_WasmerBug2_2_1_Bypass; private: wasm_engine_t* _engine; @@ -85,8 +79,6 @@ private: }; std::unordered_map, pair_hash> _scriptCapabilities; - - ArbUt::Dictionary _loadedPointers; }; #endif // PKMNLIB_WEBASSEMBLYSCRIPTRESOLVER_HPP