1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-26 02:47:34 +00:00

LibWasm: Correct memory init size when instantiating

These limits are in units of page size, not bytes.
Also fixes incorrect debug logs.
This commit is contained in:
Ali Mohammad Pur 2021-05-17 21:41:07 +04:30 committed by Ali Mohammad Pur
parent 4fd43a8f96
commit 4a459d2430
3 changed files with 5 additions and 4 deletions

View file

@ -162,7 +162,8 @@ InstantiationResult AbstractMachine::instantiate(const Module& module, Vector<Ex
instantiation_result = InstantiationError { String::formatted("Data segment attempted to write to out-of-bounds memory ({}) of max {} bytes", data.init.size() + offset, instance->type().limits().max().value()) };
return;
}
instance->grow(data.init.size() + offset - instance->size());
if (instance->size() < data.init.size() + offset)
instance->grow(data.init.size() + offset - instance->size());
instance->data().overwrite(offset, data.init.data(), data.init.size());
}
},

View file

@ -300,7 +300,7 @@ public:
explicit MemoryInstance(const MemoryType& type)
: m_type(type)
{
grow(m_type.limits().min());
grow(m_type.limits().min() * Constants::page_size);
}
auto& type() const { return m_type; }

View file

@ -80,7 +80,7 @@ ReadonlyBytes Interpreter::load_from_memory(Configuration& configuration, const
auto instance_address = base.value() + static_cast<i64>(arg.offset);
if (instance_address < 0 || static_cast<u64>(instance_address + size) > memory->size()) {
m_do_trap = true;
dbgln("LibWasm: Memory access out of bounds (expected 0 > {} and {} > {})", instance_address, instance_address + size, memory->size());
dbgln("LibWasm: Memory access out of bounds (expected 0 <= {} and {} <= {})", instance_address, instance_address + size, memory->size());
return {};
}
dbgln_if(WASM_TRACE_DEBUG, "load({} : {}) -> stack", instance_address, size);
@ -98,7 +98,7 @@ void Interpreter::store_to_memory(Configuration& configuration, const Instructio
auto instance_address = base.value() + static_cast<i64>(arg.offset);
if (instance_address < 0 || static_cast<u64>(instance_address + data.size()) > memory->size()) {
m_do_trap = true;
dbgln("LibWasm: Memory access out of bounds (expected 0 > {} and {} > {})", instance_address, instance_address + data.size(), memory->size());
dbgln("LibWasm: Memory access out of bounds (expected 0 <= {} and {} <= {})", instance_address, instance_address + data.size(), memory->size());
return;
}
dbgln_if(WASM_TRACE_DEBUG, "tempoaray({}b) -> store({})", data.size(), instance_address);