diff options
author | Ali Mohammad Pur <ali.mpfard@gmail.com> | 2021-05-18 01:39:12 +0430 |
---|---|---|
committer | Ali Mohammad Pur <Ali.mpfard@gmail.com> | 2021-05-26 15:34:13 +0430 |
commit | 7966168fea9c5404c41818bf809d21c79db0313e (patch) | |
tree | 4d4a73d5bd5529283a43666f74262a2e92a151ec /Userland/Libraries/LibWasm/AbstractMachine | |
parent | c31a4e9013bbacd17269942648a3f9b7f59a68c2 (diff) | |
download | serenity-7966168fea9c5404c41818bf809d21c79db0313e.zip |
LibWasm: Turn memory read failures into traps
Diffstat (limited to 'Userland/Libraries/LibWasm/AbstractMachine')
-rw-r--r-- | Userland/Libraries/LibWasm/AbstractMachine/Interpreter.cpp | 15 | ||||
-rw-r--r-- | Userland/Libraries/LibWasm/AbstractMachine/Interpreter.h | 3 |
2 files changed, 12 insertions, 6 deletions
diff --git a/Userland/Libraries/LibWasm/AbstractMachine/Interpreter.cpp b/Userland/Libraries/LibWasm/AbstractMachine/Interpreter.cpp index ccf59c3374..bba01e621e 100644 --- a/Userland/Libraries/LibWasm/AbstractMachine/Interpreter.cpp +++ b/Userland/Libraries/LibWasm/AbstractMachine/Interpreter.cpp @@ -211,32 +211,35 @@ void Interpreter::call_address(Configuration& configuration, FunctionAddress add } while (false) template<typename T> -static T read_value(ReadonlyBytes data) +T Interpreter::read_value(ReadonlyBytes data) { T value; InputMemoryStream stream { data }; 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; } template<> -float read_value<float>(ReadonlyBytes data) +float Interpreter::read_value<float>(ReadonlyBytes data) { InputMemoryStream stream { data }; LittleEndian<u32> 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)); } template<> -double read_value<double>(ReadonlyBytes data) +double Interpreter::read_value<double>(ReadonlyBytes data) { InputMemoryStream stream { data }; LittleEndian<u64> 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)); } diff --git a/Userland/Libraries/LibWasm/AbstractMachine/Interpreter.h b/Userland/Libraries/LibWasm/AbstractMachine/Interpreter.h index 0e06650bf5..7f5dfcdb5c 100644 --- a/Userland/Libraries/LibWasm/AbstractMachine/Interpreter.h +++ b/Userland/Libraries/LibWasm/AbstractMachine/Interpreter.h @@ -27,6 +27,9 @@ private: template<typename V, typename T> MakeSigned<T> checked_signed_truncate(V); + template<typename T> + T read_value(ReadonlyBytes data); + Vector<NonnullOwnPtr<Value>> pop_values(Configuration& configuration, size_t count); bool trap_if_not(bool value) { |