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:
parent
4fd43a8f96
commit
4a459d2430
3 changed files with 5 additions and 4 deletions
|
@ -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());
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
|
@ -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; }
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue