Revert "Revert "Upgrade to 5.0.71.48"" DO NOT MERGE
This reverts commit f2e3994fa5148cc3d9946666f0b0596290192b0e,
and updates the x64 makefile properly so it doesn't break that
build.
FPIIM-449
Change-Id: Ib83e35bfbae6af627451c926a9650ec57c045605
(cherry picked from commit 109988c7ccb6f3fd1a58574fa3dfb88beaef6632)
diff --git a/test/unittests/wasm/module-decoder-unittest.cc b/test/unittests/wasm/module-decoder-unittest.cc
index 0738b59..467ffcc 100644
--- a/test/unittests/wasm/module-decoder-unittest.cc
+++ b/test/unittests/wasm/module-decoder-unittest.cc
@@ -45,6 +45,15 @@
{kLocalF64, kAstF64}};
+// TODO(titzer): use these macros everywhere below.
+#define U32_LE(v) \
+ static_cast<byte>(v), static_cast<byte>((v) >> 8), \
+ static_cast<byte>((v) >> 16), static_cast<byte>((v) >> 24)
+
+
+#define U16_LE(v) static_cast<byte>(v), static_cast<byte>((v) >> 8)
+
+
TEST_F(WasmModuleVerifyTest, DecodeEmpty) {
static const byte data[1]{kDeclEnd};
{
@@ -61,7 +70,7 @@
TEST_F(WasmModuleVerifyTest, OneGlobal) {
- const byte data[] = {
+ static const byte data[] = {
kDeclGlobals,
1,
0,
@@ -100,7 +109,7 @@
TEST_F(WasmModuleVerifyTest, ZeroGlobals) {
- const byte data[] = {
+ static const byte data[] = {
kDeclGlobals, 0, // declare 0 globals
};
ModuleResult result = DecodeModule(data, data + arraysize(data));
@@ -125,7 +134,7 @@
TEST_F(WasmModuleVerifyTest, NGlobals) {
- const byte data[] = {
+ static const byte data[] = {
0, 0, 0, 0, // name offset
kMemI32, // memory type
0, // exported
@@ -146,7 +155,7 @@
TEST_F(WasmModuleVerifyTest, GlobalWithInvalidNameOffset) {
- const byte data[] = {
+ static const byte data[] = {
kDeclGlobals,
1, // declare one global
0,
@@ -162,7 +171,7 @@
TEST_F(WasmModuleVerifyTest, GlobalWithInvalidMemoryType) {
- const byte data[] = {
+ static const byte data[] = {
kDeclGlobals,
1, // declare one global
0,
@@ -178,7 +187,7 @@
TEST_F(WasmModuleVerifyTest, TwoGlobals) {
- const byte data[] = {
+ static const byte data[] = {
kDeclGlobals,
2,
0,
@@ -333,10 +342,10 @@
EXPECT_EQ(kCodeStartOffset, function->code_start_offset);
EXPECT_EQ(kCodeEndOffset, function->code_end_offset);
- EXPECT_EQ(523, function->local_int32_count);
- EXPECT_EQ(1037, function->local_int64_count);
- EXPECT_EQ(1551, function->local_float32_count);
- EXPECT_EQ(2065, function->local_float64_count);
+ EXPECT_EQ(523, function->local_i32_count);
+ EXPECT_EQ(1037, function->local_i64_count);
+ EXPECT_EQ(1551, function->local_f32_count);
+ EXPECT_EQ(2065, function->local_f64_count);
EXPECT_TRUE(function->exported);
EXPECT_FALSE(function->external);
@@ -373,10 +382,10 @@
EXPECT_EQ(0, function->code_start_offset);
EXPECT_EQ(0, function->code_end_offset);
- EXPECT_EQ(0, function->local_int32_count);
- EXPECT_EQ(0, function->local_int64_count);
- EXPECT_EQ(0, function->local_float32_count);
- EXPECT_EQ(0, function->local_float64_count);
+ EXPECT_EQ(0, function->local_i32_count);
+ EXPECT_EQ(0, function->local_i64_count);
+ EXPECT_EQ(0, function->local_f32_count);
+ EXPECT_EQ(0, function->local_f64_count);
EXPECT_FALSE(function->exported);
EXPECT_TRUE(function->external);
@@ -410,10 +419,10 @@
EXPECT_EQ(kCodeStartOffset, function->code_start_offset);
EXPECT_EQ(kCodeEndOffset, function->code_end_offset);
- EXPECT_EQ(0, function->local_int32_count);
- EXPECT_EQ(0, function->local_int64_count);
- EXPECT_EQ(0, function->local_float32_count);
- EXPECT_EQ(0, function->local_float64_count);
+ EXPECT_EQ(0, function->local_i32_count);
+ EXPECT_EQ(0, function->local_i64_count);
+ EXPECT_EQ(0, function->local_f32_count);
+ EXPECT_EQ(0, function->local_f64_count);
EXPECT_FALSE(function->exported);
EXPECT_FALSE(function->external);
@@ -450,10 +459,10 @@
EXPECT_EQ(kCodeStartOffset, function->code_start_offset);
EXPECT_EQ(kCodeEndOffset, function->code_end_offset);
- EXPECT_EQ(513, function->local_int32_count);
- EXPECT_EQ(1027, function->local_int64_count);
- EXPECT_EQ(1541, function->local_float32_count);
- EXPECT_EQ(2055, function->local_float64_count);
+ EXPECT_EQ(513, function->local_i32_count);
+ EXPECT_EQ(1027, function->local_i64_count);
+ EXPECT_EQ(1541, function->local_f32_count);
+ EXPECT_EQ(2055, function->local_f64_count);
EXPECT_FALSE(function->exported);
EXPECT_FALSE(function->external);
@@ -463,10 +472,13 @@
TEST_F(WasmModuleVerifyTest, OneGlobalOneFunctionWithNopBodyOneDataSegment) {
- static const byte kCodeStartOffset = 2 + kDeclGlobalSize + 4 + 2 + 17;
+ static const byte kDeclMemorySize = 4;
+ static const byte kCodeStartOffset =
+ 2 + kDeclMemorySize + kDeclGlobalSize + 4 + 2 + 17;
static const byte kCodeEndOffset = kCodeStartOffset + 3;
static const byte data[] = {
+ kDeclMemory, 28, 28, 1,
// global#0 --------------------------------------------------
kDeclGlobals, 1, 0, 0, 0, 0, // name offset
kMemU8, // memory type
@@ -531,24 +543,17 @@
TEST_F(WasmModuleVerifyTest, OneDataSegment) {
const byte data[] = {
- kDeclDataSegments,
- 1,
- 0xaa,
- 0xbb,
- 0x09,
+ kDeclMemory, 28, 28, 1, kDeclDataSegments, 1, 0xaa, 0xbb, 0x09,
0, // dest addr
- 11,
- 0,
- 0,
+ 11, 0, 0,
0, // source offset
- 3,
- 0,
- 0,
+ 3, 0, 0,
0, // source size
1, // init
};
{
+ EXPECT_VERIFIES(data);
ModuleResult result = DecodeModule(data, data + arraysize(data));
EXPECT_TRUE(result.ok());
EXPECT_EQ(0, result.val->globals->size());
@@ -565,7 +570,7 @@
if (result.val) delete result.val;
}
- for (size_t size = 1; size < arraysize(data); size++) {
+ for (size_t size = 5; size < arraysize(data); size++) {
// Should fall off end of module bytes.
ModuleResult result = DecodeModule(data, data + size);
EXPECT_FALSE(result.ok());
@@ -576,32 +581,18 @@
TEST_F(WasmModuleVerifyTest, TwoDataSegments) {
const byte data[] = {
- kDeclDataSegments,
- 2,
- 0xee,
- 0xff,
- 0x07,
+ kDeclMemory, 28, 28, 1, kDeclDataSegments, 2, 0xee, 0xff, 0x07,
0, // dest addr
- 9,
- 0,
- 0,
+ 9, 0, 0,
0, // #0: source offset
- 4,
- 0,
- 0,
+ 4, 0, 0,
0, // source size
0, // init
- 0xcc,
- 0xdd,
- 0x06,
+ 0xcc, 0xdd, 0x06,
0, // #1: dest addr
- 6,
- 0,
- 0,
+ 6, 0, 0,
0, // source offset
- 10,
- 0,
- 0,
+ 10, 0, 0,
0, // source size
1, // init
};
@@ -629,7 +620,7 @@
if (result.val) delete result.val;
}
- for (size_t size = 1; size < arraysize(data); size++) {
+ for (size_t size = 5; size < arraysize(data); size++) {
// Should fall off end of module bytes.
ModuleResult result = DecodeModule(data, data + size);
EXPECT_FALSE(result.ok());
@@ -638,6 +629,71 @@
}
+TEST_F(WasmModuleVerifyTest, DataSegmentWithInvalidSource) {
+ const int dest_addr = 0x100;
+ const byte mem_size_log2 = 15;
+ const int kDataSize = 19;
+
+ for (int source_offset = 0; source_offset < 5 + kDataSize; source_offset++) {
+ for (int source_size = -1; source_size < 5 + kDataSize; source_size += 3) {
+ byte data[] = {
+ kDeclMemory,
+ mem_size_log2,
+ mem_size_log2,
+ 1,
+ kDeclDataSegments,
+ 1,
+ U32_LE(dest_addr),
+ U32_LE(source_offset),
+ U32_LE(source_size),
+ 1, // init
+ };
+
+ STATIC_ASSERT(kDataSize == arraysize(data));
+
+ if (source_offset < kDataSize && source_size >= 0 &&
+ (source_offset + source_size) <= kDataSize) {
+ EXPECT_VERIFIES(data);
+ } else {
+ EXPECT_FAILURE(data);
+ }
+ }
+ }
+}
+
+
+TEST_F(WasmModuleVerifyTest, DataSegmentWithInvalidDest) {
+ const int source_size = 3;
+ const int source_offset = 11;
+
+ for (byte mem_size_log2 = 12; mem_size_log2 < 20; mem_size_log2++) {
+ int mem_size = 1 << mem_size_log2;
+
+ for (int dest_addr = mem_size - source_size;
+ dest_addr < mem_size + source_size; dest_addr++) {
+ byte data[] = {
+ kDeclMemory,
+ mem_size_log2,
+ mem_size_log2,
+ 1,
+ kDeclDataSegments,
+ 1,
+ U32_LE(dest_addr),
+ U32_LE(source_offset),
+ U32_LE(source_size),
+ 1, // init
+ };
+
+ if (dest_addr <= (mem_size - source_size)) {
+ EXPECT_VERIFIES(data);
+ } else {
+ EXPECT_FAILURE(data);
+ }
+ }
+ }
+}
+
+
// To make below tests for indirect calls much shorter.
#define FUNCTION(sig_index, external) \
kDeclFunctionImport, static_cast<byte>(sig_index), \
@@ -848,7 +904,7 @@
TEST_F(WasmFunctionVerifyTest, Ok_v_v_empty) {
- byte data[] = {
+ static const byte data[] = {
0, kLocalVoid, // signature
3, 0, // local int32 count
4, 0, // local int64 count
@@ -868,10 +924,10 @@
EXPECT_EQ(0, function->name_offset);
EXPECT_EQ(arraysize(data) - 1, function->code_start_offset);
EXPECT_EQ(arraysize(data), function->code_end_offset);
- EXPECT_EQ(3, function->local_int32_count);
- EXPECT_EQ(4, function->local_int64_count);
- EXPECT_EQ(5, function->local_float32_count);
- EXPECT_EQ(6, function->local_float64_count);
+ EXPECT_EQ(3, function->local_i32_count);
+ EXPECT_EQ(4, function->local_i64_count);
+ EXPECT_EQ(5, function->local_f32_count);
+ EXPECT_EQ(6, function->local_f64_count);
EXPECT_FALSE(function->external);
EXPECT_FALSE(function->exported);
}
@@ -889,7 +945,7 @@
TEST_F(WasmModuleVerifyTest, WLLSectionEmpty) {
- const byte data[] = {
+ static const byte data[] = {
kDeclWLL, 0, // empty section
};
ModuleResult result = DecodeModule(data, data + arraysize(data));
@@ -899,7 +955,7 @@
TEST_F(WasmModuleVerifyTest, WLLSectionOne) {
- const byte data[] = {
+ static const byte data[] = {
kDeclWLL,
1, // LEB128 1
0, // one byte section
@@ -911,10 +967,10 @@
TEST_F(WasmModuleVerifyTest, WLLSectionTen) {
- const byte data[] = {
+ static const byte data[] = {
kDeclWLL,
- 10, // LEB128 10
- 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, // 10 byte section
+ 10, // LEB128 10
+ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, // 10 byte section
};
ModuleResult result = DecodeModule(data, data + arraysize(data));
EXPECT_TRUE(result.ok());
@@ -923,20 +979,19 @@
TEST_F(WasmModuleVerifyTest, WLLSectionOverflow) {
- const byte data[] = {
+ static const byte data[] = {
kDeclWLL,
- 11, // LEB128 11
- 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, // 10 byte section
+ 11, // LEB128 11
+ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, // 10 byte section
};
EXPECT_FAILURE(data);
}
TEST_F(WasmModuleVerifyTest, WLLSectionUnderflow) {
- const byte data[] = {
- kDeclWLL,
- 0xff, 0xff, 0xff, 0xff, 0x0f, // LEB128 0xffffffff
- 1, 2, 3, 4, // 4 byte section
+ static const byte data[] = {
+ kDeclWLL, 0xff, 0xff, 0xff, 0xff, 0x0f, // LEB128 0xffffffff
+ 1, 2, 3, 4, // 4 byte section
};
EXPECT_FAILURE(data);
}
@@ -944,14 +999,92 @@
TEST_F(WasmModuleVerifyTest, WLLSectionLoop) {
// Would infinite loop decoding if wrapping and allowed.
- const byte data[] = {
- kDeclWLL,
- 0xfa, 0xff, 0xff, 0xff, 0x0f, // LEB128 0xfffffffa
- 1, 2, 3, 4, // 4 byte section
+ static const byte data[] = {
+ kDeclWLL, 0xfa, 0xff, 0xff, 0xff, 0x0f, // LEB128 0xfffffffa
+ 1, 2, 3, 4, // 4 byte section
};
EXPECT_FAILURE(data);
}
+TEST_F(WasmModuleVerifyTest, ImportTable_empty) {
+ static const byte data[] = {kDeclSignatures, 0, kDeclImportTable, 0};
+ EXPECT_VERIFIES(data);
+}
+
+TEST_F(WasmModuleVerifyTest, ImportTable_nosigs) {
+ static const byte data[] = {kDeclImportTable, 0};
+ EXPECT_FAILURE(data);
+}
+
+TEST_F(WasmModuleVerifyTest, ImportTable_invalid_sig) {
+ static const byte data[] = {
+ kDeclSignatures,
+ 0,
+ kDeclImportTable,
+ 1,
+ 0,
+ 0, // sig index
+ 1,
+ 0,
+ 0,
+ 0, // module name
+ 1,
+ 0,
+ 0,
+ 0 // function name
+ };
+ EXPECT_FAILURE(data);
+}
+
+TEST_F(WasmModuleVerifyTest, ImportTable_one_sig) {
+ static const byte data[] = {
+ kDeclSignatures,
+ 1,
+ 0,
+ static_cast<byte>(kAstStmt),
+ kDeclImportTable,
+ 1,
+ 0,
+ 0, // sig index
+ 1,
+ 0,
+ 0,
+ 0, // module name
+ 1,
+ 0,
+ 0,
+ 0 // function name
+ };
+ EXPECT_VERIFIES(data);
+}
+
+TEST_F(WasmModuleVerifyTest, ImportTable_off_end) {
+ static const byte data[] = {
+ kDeclSignatures,
+ 1,
+ 0,
+ static_cast<byte>(kAstStmt),
+ kDeclImportTable,
+ 1,
+ 0,
+ 0, // sig index
+ 1,
+ 0,
+ 0,
+ 0, // module name
+ 1,
+ 0,
+ 0,
+ 0 // function name
+ };
+
+ for (size_t length = 5; length < sizeof(data); length++) {
+ ModuleResult result = DecodeModule(data, data + length);
+ EXPECT_FALSE(result.ok());
+ if (result.val) delete result.val;
+ }
+}
+
} // namespace wasm
} // namespace internal
} // namespace v8