in plugins/experimental/wasm/lib/src/wasm.cc [248:324]
bool WasmBase::load(const std::string &code, bool allow_precompiled) {
assert(!started_from_.has_value());
if (!wasm_vm_) {
return false;
}
if (wasm_vm_->getEngineName() == "null") {
auto ok = wasm_vm_->load(code, {}, {});
if (!ok) {
fail(FailState::UnableToInitializeCode, "Failed to load NullVM plugin");
return false;
}
abi_version_ = AbiVersion::ProxyWasm_0_2_1;
return true;
}
// Verify signature.
std::string message;
if (!SignatureUtil::verifySignature(code, message)) {
fail(FailState::UnableToInitializeCode, message);
return false;
}
if (!message.empty()) {
wasm_vm_->integration()->trace(message);
}
// Get ABI version from the module.
if (!BytecodeUtil::getAbiVersion(code, abi_version_)) {
fail(FailState::UnableToInitializeCode, "Failed to parse corrupted Wasm module");
return false;
}
if (abi_version_ == AbiVersion::Unknown) {
fail(FailState::UnableToInitializeCode, "Missing or unknown Proxy-Wasm ABI version");
return false;
}
// Get function names from the module.
if (!BytecodeUtil::getFunctionNameIndex(code, function_names_)) {
fail(FailState::UnableToInitializeCode, "Failed to parse corrupted Wasm module");
return false;
}
std::string_view precompiled = {};
if (allow_precompiled) {
// Check if precompiled module exists.
const auto section_name = wasm_vm_->getPrecompiledSectionName();
if (!section_name.empty()) {
if (!BytecodeUtil::getCustomSection(code, section_name, precompiled)) {
fail(FailState::UnableToInitializeCode, "Failed to parse corrupted Wasm module");
return false;
}
}
}
// Get original bytecode (possibly stripped).
std::string stripped;
if (!BytecodeUtil::getStrippedSource(code, stripped)) {
fail(FailState::UnableToInitializeCode, "Failed to parse corrupted Wasm module");
return false;
}
auto ok = wasm_vm_->load(stripped, precompiled, function_names_);
if (!ok) {
fail(FailState::UnableToInitializeCode, "Failed to load Wasm bytecode");
return false;
}
// Store for future use in non-cloneable Wasm engines.
if (wasm_vm_->cloneable() == Cloneable::NotCloneable) {
module_bytecode_ = stripped;
module_precompiled_ = precompiled;
}
return true;
}