From 4f2d898a51ad2276c469f7d00b2353f08c5c4db7 Mon Sep 17 00:00:00 2001 From: Ali Mohammad Pur Date: Tue, 15 Feb 2022 03:05:49 +0330 Subject: [PATCH] LibWasm: Make MemoryInstance allocation fail if initial growth fails ...instead of silently ignoring the failure in the constructor. --- .../LibWasm/AbstractMachine/AbstractMachine.cpp | 6 +++++- .../LibWasm/AbstractMachine/AbstractMachine.h | 15 ++++++++++++--- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/Userland/Libraries/LibWasm/AbstractMachine/AbstractMachine.cpp b/Userland/Libraries/LibWasm/AbstractMachine/AbstractMachine.cpp index 6893296e29..49d8abc741 100644 --- a/Userland/Libraries/LibWasm/AbstractMachine/AbstractMachine.cpp +++ b/Userland/Libraries/LibWasm/AbstractMachine/AbstractMachine.cpp @@ -43,7 +43,11 @@ Optional Store::allocate(TableType const& type) Optional Store::allocate(MemoryType const& type) { MemoryAddress address { m_memories.size() }; - m_memories.empend(MemoryInstance { type }); + auto instance = MemoryInstance::create(type); + if (instance.is_error()) + return {}; + + m_memories.append(instance.release_value()); return address; } diff --git a/Userland/Libraries/LibWasm/AbstractMachine/AbstractMachine.h b/Userland/Libraries/LibWasm/AbstractMachine/AbstractMachine.h index d94478e5ef..3278063c12 100644 --- a/Userland/Libraries/LibWasm/AbstractMachine/AbstractMachine.h +++ b/Userland/Libraries/LibWasm/AbstractMachine/AbstractMachine.h @@ -331,10 +331,14 @@ private: class MemoryInstance { public: - explicit MemoryInstance(MemoryType const& type) - : m_type(type) + static ErrorOr create(MemoryType const& type) { - grow(m_type.limits().min() * Constants::page_size); + MemoryInstance instance { type }; + + if (!instance.grow(type.limits().min() * Constants::page_size)) + return Error::from_string_literal("Failed to grow to requested size"); + + return { move(instance) }; } auto& type() const { return m_type; } @@ -364,6 +368,11 @@ public: } private: + explicit MemoryInstance(MemoryType const& type) + : m_type(type) + { + } + MemoryType const& m_type; size_t m_size { 0 }; ByteBuffer m_data;