1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-26 02:37:35 +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()) }; 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; 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()); instance->data().overwrite(offset, data.init.data(), data.init.size());
} }
}, },

View file

@ -300,7 +300,7 @@ public:
explicit MemoryInstance(const MemoryType& type) explicit MemoryInstance(const MemoryType& type)
: m_type(type) : m_type(type)
{ {
grow(m_type.limits().min()); grow(m_type.limits().min() * Constants::page_size);
} }
auto& type() const { return m_type; } 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); auto instance_address = base.value() + static_cast<i64>(arg.offset);
if (instance_address < 0 || static_cast<u64>(instance_address + size) > memory->size()) { if (instance_address < 0 || static_cast<u64>(instance_address + size) > memory->size()) {
m_do_trap = true; 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 {}; return {};
} }
dbgln_if(WASM_TRACE_DEBUG, "load({} : {}) -> stack", instance_address, size); 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); auto instance_address = base.value() + static_cast<i64>(arg.offset);
if (instance_address < 0 || static_cast<u64>(instance_address + data.size()) > memory->size()) { if (instance_address < 0 || static_cast<u64>(instance_address + data.size()) > memory->size()) {
m_do_trap = true; 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; return;
} }
dbgln_if(WASM_TRACE_DEBUG, "tempoaray({}b) -> store({})", data.size(), instance_address); dbgln_if(WASM_TRACE_DEBUG, "tempoaray({}b) -> store({})", data.size(), instance_address);