Fixes annoying issue in wasmer, removes pointer type validation for now
All checks were successful
continuous-integration/drone/push Build is passing
All checks were successful
continuous-integration/drone/push Build is passing
This commit is contained in:
@@ -68,10 +68,8 @@ public:
|
||||
return f;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
inline static T ConvertAllArguments(const wasm_val_vec_t* t, std::size_t& index,
|
||||
WebAssemblyScriptResolver* resolver) {
|
||||
return FromVal<T>(t->data[index++], resolver);
|
||||
template <typename T> inline static T ConvertAllArguments(const wasm_val_vec_t* t, std::size_t& index) {
|
||||
return FromVal<T>(t->data[index++]);
|
||||
}
|
||||
|
||||
template <class R, class... Args>
|
||||
@@ -81,25 +79,28 @@ public:
|
||||
struct Env {
|
||||
WebAssemblyScriptResolver* Resolver;
|
||||
std::function<R(WebAssemblyScriptResolver*, Args...)> 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<Args>(parameters, index, e.Resolver)...);
|
||||
results->data[0] = ToVal<R>(result);
|
||||
try {
|
||||
R result = e.Func(e.Resolver, ConvertAllArguments<Args>(parameters, index)...);
|
||||
results->data[0] = ToVal<R>(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<T, const ArbUt::StringView&>()) {
|
||||
return WASM_I64_VAL(reinterpret_cast<i64>(&val));
|
||||
auto v = &val;
|
||||
return WASM_I64_VAL(reinterpret_cast<i64>(v));
|
||||
}
|
||||
THROW("Unhandled value type: ", typeid(T).name());
|
||||
}
|
||||
|
||||
template <typename T> inline static T FromVal(const wasm_val_t& val, WebAssemblyScriptResolver* resolver) {
|
||||
template <typename T> inline static T FromVal(const wasm_val_t& val) {
|
||||
if constexpr (std::is_pointer<T>()) {
|
||||
auto v = reinterpret_cast<void*>(val.of.i64);
|
||||
Ensure(resolver->ValidateLoadedPointer<std::remove_pointer<T>>(v));
|
||||
return (T)v;
|
||||
return (T) reinterpret_cast<void*>(val.of.i64);
|
||||
} else if constexpr (is_specialization<T, ArbUt::BorrowedPtr>::value) {
|
||||
return dynamic_cast<T>(reinterpret_cast<void*>(val.of.i64));
|
||||
} else if constexpr (is_specialization<T, ArbUt::OptionalBorrowedPtr>::value) {
|
||||
|
||||
Reference in New Issue
Block a user