1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-26 03:37:43 +00:00

LibWasm: Turn memory read failures into traps

This commit is contained in:
Ali Mohammad Pur 2021-05-18 01:39:12 +04:30 committed by Ali Mohammad Pur
parent c31a4e9013
commit 7966168fea
2 changed files with 12 additions and 6 deletions

View file

@ -211,32 +211,35 @@ void Interpreter::call_address(Configuration& configuration, FunctionAddress add
} while (false) } while (false)
template<typename T> template<typename T>
static T read_value(ReadonlyBytes data) T Interpreter::read_value(ReadonlyBytes data)
{ {
T value; T value;
InputMemoryStream stream { data }; InputMemoryStream stream { data };
auto ok = IsSigned<T> ? LEB128::read_signed(stream, value) : LEB128::read_unsigned(stream, value); auto ok = IsSigned<T> ? LEB128::read_signed(stream, value) : LEB128::read_unsigned(stream, value);
VERIFY(ok); if (stream.handle_any_error() || !ok)
m_do_trap = true;
return value; return value;
} }
template<> template<>
float read_value<float>(ReadonlyBytes data) float Interpreter::read_value<float>(ReadonlyBytes data)
{ {
InputMemoryStream stream { data }; InputMemoryStream stream { data };
LittleEndian<u32> raw_value; LittleEndian<u32> raw_value;
stream >> raw_value; stream >> raw_value;
VERIFY(!stream.has_any_error()); if (stream.handle_any_error())
m_do_trap = true;
return bit_cast<float>(static_cast<u32>(raw_value)); return bit_cast<float>(static_cast<u32>(raw_value));
} }
template<> template<>
double read_value<double>(ReadonlyBytes data) double Interpreter::read_value<double>(ReadonlyBytes data)
{ {
InputMemoryStream stream { data }; InputMemoryStream stream { data };
LittleEndian<u64> raw_value; LittleEndian<u64> raw_value;
stream >> raw_value; stream >> raw_value;
VERIFY(!stream.has_any_error()); if (stream.handle_any_error())
m_do_trap = true;
return bit_cast<double>(static_cast<u64>(raw_value)); return bit_cast<double>(static_cast<u64>(raw_value));
} }

View file

@ -27,6 +27,9 @@ private:
template<typename V, typename T> template<typename V, typename T>
MakeSigned<T> checked_signed_truncate(V); MakeSigned<T> checked_signed_truncate(V);
template<typename T>
T read_value(ReadonlyBytes data);
Vector<NonnullOwnPtr<Value>> pop_values(Configuration& configuration, size_t count); Vector<NonnullOwnPtr<Value>> pop_values(Configuration& configuration, size_t count);
bool trap_if_not(bool value) bool trap_if_not(bool value)
{ {