summaryrefslogtreecommitdiff
path: root/Userland/Libraries/LibWasm/AbstractMachine
diff options
context:
space:
mode:
authorAli Mohammad Pur <ali.mpfard@gmail.com>2021-05-18 01:39:12 +0430
committerAli Mohammad Pur <Ali.mpfard@gmail.com>2021-05-26 15:34:13 +0430
commit7966168fea9c5404c41818bf809d21c79db0313e (patch)
tree4d4a73d5bd5529283a43666f74262a2e92a151ec /Userland/Libraries/LibWasm/AbstractMachine
parentc31a4e9013bbacd17269942648a3f9b7f59a68c2 (diff)
downloadserenity-7966168fea9c5404c41818bf809d21c79db0313e.zip
LibWasm: Turn memory read failures into traps
Diffstat (limited to 'Userland/Libraries/LibWasm/AbstractMachine')
-rw-r--r--Userland/Libraries/LibWasm/AbstractMachine/Interpreter.cpp15
-rw-r--r--Userland/Libraries/LibWasm/AbstractMachine/Interpreter.h3
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)
{