diff --git a/Userland/Libraries/LibWasm/AbstractMachine/Validator.cpp b/Userland/Libraries/LibWasm/AbstractMachine/Validator.cpp index 58b72a0abcd..6102bd1a7a1 100644 --- a/Userland/Libraries/LibWasm/AbstractMachine/Validator.cpp +++ b/Userland/Libraries/LibWasm/AbstractMachine/Validator.cpp @@ -41,6 +41,10 @@ ErrorOr Validator::validate(Module& module) m_context.types.extend(section.types()); }); + module.for_each_section_of_type([this](DataCountSection const& section) { + m_context.data_count = section.count(); + }); + module.for_each_section_of_type([&](ImportSection const& section) { for (auto& import_ : section.imports()) { import_.description().visit( @@ -177,6 +181,8 @@ ErrorOr Validator::validate(StartSection const& section) ErrorOr Validator::validate(DataSection const& section) { + if (m_context.data_count.has_value() && section.data().size() != m_context.data_count) + return Errors::invalid("data count does not match segment count"sv); for (auto& entry : section.data()) { TRY(entry.value().visit( [](DataSection::Data::Passive const&) { return ErrorOr {}; }, diff --git a/Userland/Libraries/LibWasm/AbstractMachine/Validator.h b/Userland/Libraries/LibWasm/AbstractMachine/Validator.h index 2cd96730d6c..e1c7e3bc1a5 100644 --- a/Userland/Libraries/LibWasm/AbstractMachine/Validator.h +++ b/Userland/Libraries/LibWasm/AbstractMachine/Validator.h @@ -27,6 +27,7 @@ struct Context { COWVector datas; COWVector locals; COWVector labels; + Optional data_count; Optional return_; AK::HashTable references; size_t imported_function_count { 0 };