From 22fc4f7426d5fb7edc79ef086ce7c30c748e898c Mon Sep 17 00:00:00 2001 From: Andrei Maiboroda Date: Wed, 17 Mar 2021 13:13:57 +0100 Subject: [PATCH 1/2] test: Imported memory/tables limits having max less than min --- test/unittests/instantiate_test.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/test/unittests/instantiate_test.cpp b/test/unittests/instantiate_test.cpp index 1082d7bb6..b77e5ef5f 100644 --- a/test/unittests/instantiate_test.cpp +++ b/test/unittests/instantiate_test.cpp @@ -177,6 +177,10 @@ TEST(instantiate, imported_table_invalid) EXPECT_THROW_MESSAGE(instantiate(*module, {}, {{&table, {10, std::nullopt}}}), instantiate_error, "provided import's max is above import's max defined in module"); + // Provided limits have max less than min + EXPECT_THROW_MESSAGE(instantiate(*module, {}, {{&table, {10, 0}}}), instantiate_error, + "provided imported table doesn't fit provided limits"); + // Null pointer EXPECT_THROW_MESSAGE(instantiate(*module, {}, {{nullptr, {10, 30}}}), instantiate_error, "provided imported table has a null pointer to data"); @@ -283,6 +287,10 @@ TEST(instantiate, imported_memory_invalid) EXPECT_THROW_MESSAGE(instantiate(*module, {}, {}, {{&memory, {1, std::nullopt}}}), instantiate_error, "provided import's max is above import's max defined in module"); + // Provided limits have max less than min + EXPECT_THROW_MESSAGE(instantiate(*module, {}, {}, {{&memory, {1, 0}}}), instantiate_error, + "provided imported memory doesn't fit provided limits"); + // Null pointer EXPECT_THROW_MESSAGE(instantiate(*module, {}, {}, {{nullptr, {1, 3}}}), instantiate_error, "provided imported memory has a null pointer to data"); From 52defb18921a320825a620bdc29545b0fcd27784 Mon Sep 17 00:00:00 2001 From: Andrei Maiboroda Date: Wed, 17 Mar 2021 13:10:41 +0100 Subject: [PATCH 2/2] Add check to instantiate for imported memory/table limits validity --- lib/fizzy/instantiate.cpp | 3 +++ test/unittests/instantiate_test.cpp | 4 ++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/lib/fizzy/instantiate.cpp b/lib/fizzy/instantiate.cpp index f3aa69194..79fa2c994 100644 --- a/lib/fizzy/instantiate.cpp +++ b/lib/fizzy/instantiate.cpp @@ -40,6 +40,9 @@ void match_imported_functions(const std::vector& module_imported_types void match_limits(const Limits& external_limits, const Limits& module_limits) { + if (external_limits.max.has_value() && external_limits.min > *external_limits.max) + throw instantiate_error{"provided import's min limit is above import's max limit"}; + if (external_limits.min < module_limits.min) throw instantiate_error{"provided import's min is below import's min defined in module"}; diff --git a/test/unittests/instantiate_test.cpp b/test/unittests/instantiate_test.cpp index b77e5ef5f..0db2a2ce5 100644 --- a/test/unittests/instantiate_test.cpp +++ b/test/unittests/instantiate_test.cpp @@ -179,7 +179,7 @@ TEST(instantiate, imported_table_invalid) // Provided limits have max less than min EXPECT_THROW_MESSAGE(instantiate(*module, {}, {{&table, {10, 0}}}), instantiate_error, - "provided imported table doesn't fit provided limits"); + "provided import's min limit is above import's max limit"); // Null pointer EXPECT_THROW_MESSAGE(instantiate(*module, {}, {{nullptr, {10, 30}}}), instantiate_error, @@ -289,7 +289,7 @@ TEST(instantiate, imported_memory_invalid) // Provided limits have max less than min EXPECT_THROW_MESSAGE(instantiate(*module, {}, {}, {{&memory, {1, 0}}}), instantiate_error, - "provided imported memory doesn't fit provided limits"); + "provided import's min limit is above import's max limit"); // Null pointer EXPECT_THROW_MESSAGE(instantiate(*module, {}, {}, {{nullptr, {1, 3}}}), instantiate_error,