| OLD | NEW |
| 1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // Copyright 2015 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "test/unittests/test-utils.h" | 5 #include "test/unittests/test-utils.h" |
| 6 | 6 |
| 7 #include "src/wasm/module-decoder.h" | 7 #include "src/wasm/module-decoder.h" |
| 8 #include "src/wasm/wasm-macro-gen.h" | 8 #include "src/wasm/wasm-macro-gen.h" |
| 9 #include "src/wasm/wasm-opcodes.h" | 9 #include "src/wasm/wasm-opcodes.h" |
| 10 | 10 |
| (...skipping 438 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 449 EXPECT_FALSE(function->exported); | 449 EXPECT_FALSE(function->exported); |
| 450 EXPECT_FALSE(function->external); | 450 EXPECT_FALSE(function->external); |
| 451 | 451 |
| 452 if (result.val) delete result.val; | 452 if (result.val) delete result.val; |
| 453 } | 453 } |
| 454 | 454 |
| 455 | 455 |
| 456 TEST_F(WasmModuleVerifyTest, OneGlobalOneFunctionWithNopBodyOneDataSegment) { | 456 TEST_F(WasmModuleVerifyTest, OneGlobalOneFunctionWithNopBodyOneDataSegment) { |
| 457 static const byte kCodeStartOffset = 8 + 4 + 5 + 4 + 18; | 457 static const byte kCodeStartOffset = 8 + 4 + 5 + 4 + 18; |
| 458 static const byte kCodeEndOffset = kCodeStartOffset + 3; | 458 static const byte kCodeEndOffset = kCodeStartOffset + 3; |
| 459 static const byte kDataSegmentSourceOffset = kCodeEndOffset + 6; |
| 459 | 460 |
| 460 static const byte data[] = { | 461 static const byte data[] = { |
| 461 kDeclMemory, 28, 28, 1, | 462 kDeclMemory, 28, 28, 1, |
| 462 // global#0 -------------------------------------------------- | 463 // global#0 -------------------------------------------------- |
| 463 kDeclGlobals, 1, 0, // name length | 464 kDeclGlobals, 1, 0, // name length |
| 464 kMemU8, // memory type | 465 kMemU8, // memory type |
| 465 0, // exported | 466 0, // exported |
| 466 // sig#0 ----------------------------------------------------- | 467 // sig#0 ----------------------------------------------------- |
| 467 kDeclSignatures, 1, 0, 0, // void -> void | 468 kDeclSignatures, 1, 0, 0, // void -> void |
| 468 // func#0 ---------------------------------------------------- | 469 // func#0 ---------------------------------------------------- |
| 469 kDeclFunctions, 1, kDeclFunctionLocals | kDeclFunctionName, 0, | 470 kDeclFunctions, 1, kDeclFunctionLocals | kDeclFunctionName, 0, |
| 470 0, // signature index | 471 0, // signature index |
| 471 2, 'h', 'i', // name | 472 2, 'h', 'i', // name |
| 472 1, 2, // local int32 count | 473 1, 2, // local int32 count |
| 473 3, 4, // local int64 count | 474 3, 4, // local int64 count |
| 474 5, 6, // local float32 count | 475 5, 6, // local float32 count |
| 475 7, 8, // local float64 count | 476 7, 8, // local float64 count |
| 476 3, 0, // body size | 477 3, 0, // body size |
| 477 kExprNop, // func#0 body | 478 kExprNop, // func#0 body |
| 478 kExprNop, // func#0 body | 479 kExprNop, // func#0 body |
| 479 kExprNop, // func#0 body | 480 kExprNop, // func#0 body |
| 480 // segment#0 ------------------------------------------------- | 481 // segment#0 ------------------------------------------------- |
| 481 kDeclDataSegments, 1, 0xae, 0xb3, 0x08, 0, // dest addr | 482 kDeclDataSegments, 1, U32V_3(0x8b3ae), // dest addr |
| 482 15, 0, 0, 0, // source offset | 483 U32V_1(5), // source size |
| 483 5, 0, 0, 0, // source size | 484 0, 1, 2, 3, 4, // data bytes |
| 484 1, // init | |
| 485 // rest ------------------------------------------------------ | 485 // rest ------------------------------------------------------ |
| 486 kDeclEnd, | 486 kDeclEnd, |
| 487 }; | 487 }; |
| 488 | 488 |
| 489 { | 489 { |
| 490 ModuleResult result = DecodeModule(data, data + arraysize(data)); | 490 ModuleResult result = DecodeModule(data, data + arraysize(data)); |
| 491 EXPECT_TRUE(result.ok()); | 491 EXPECT_TRUE(result.ok()); |
| 492 EXPECT_EQ(1, result.val->globals.size()); | 492 EXPECT_EQ(1, result.val->globals.size()); |
| 493 EXPECT_EQ(1, result.val->functions.size()); | 493 EXPECT_EQ(1, result.val->functions.size()); |
| 494 EXPECT_EQ(1, result.val->data_segments.size()); | 494 EXPECT_EQ(1, result.val->data_segments.size()); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 506 EXPECT_EQ(2, function->name_length); | 506 EXPECT_EQ(2, function->name_length); |
| 507 EXPECT_EQ(kCodeStartOffset, function->code_start_offset); | 507 EXPECT_EQ(kCodeStartOffset, function->code_start_offset); |
| 508 EXPECT_EQ(kCodeEndOffset, function->code_end_offset); | 508 EXPECT_EQ(kCodeEndOffset, function->code_end_offset); |
| 509 | 509 |
| 510 EXPECT_FALSE(function->exported); | 510 EXPECT_FALSE(function->exported); |
| 511 EXPECT_FALSE(function->external); | 511 EXPECT_FALSE(function->external); |
| 512 | 512 |
| 513 WasmDataSegment* segment = &result.val->data_segments.back(); | 513 WasmDataSegment* segment = &result.val->data_segments.back(); |
| 514 | 514 |
| 515 EXPECT_EQ(0x8b3ae, segment->dest_addr); | 515 EXPECT_EQ(0x8b3ae, segment->dest_addr); |
| 516 EXPECT_EQ(15, segment->source_offset); | 516 EXPECT_EQ(kDataSegmentSourceOffset, segment->source_offset); |
| 517 EXPECT_EQ(5, segment->source_size); | 517 EXPECT_EQ(5, segment->source_size); |
| 518 EXPECT_TRUE(segment->init); | 518 EXPECT_TRUE(segment->init); |
| 519 | 519 |
| 520 if (result.val) delete result.val; | 520 if (result.val) delete result.val; |
| 521 } | 521 } |
| 522 } | 522 } |
| 523 | 523 |
| 524 | 524 |
| 525 TEST_F(WasmModuleVerifyTest, OneDataSegment) { | 525 TEST_F(WasmModuleVerifyTest, OneDataSegment) { |
| 526 const byte kDataSegmentSourceOffset = 8 + 10; |
| 526 const byte data[] = { | 527 const byte data[] = { |
| 527 kDeclMemory, 28, 28, 1, kDeclDataSegments, 1, 0xaa, 0xbb, 0x09, | 528 kDeclMemory, 28, 28, 1, |
| 528 0, // dest addr | 529 kDeclDataSegments, 1, |
| 529 11, 0, 0, | 530 U32V_3(0x9bbaa), // dest addr |
| 530 0, // source offset | 531 U32V_1(3), // source size |
| 531 3, 0, 0, | 532 'a', 'b', 'c' // data bytes |
| 532 0, // source size | |
| 533 1, // init | |
| 534 }; | 533 }; |
| 535 | 534 |
| 536 { | 535 { |
| 537 EXPECT_VERIFIES(data); | 536 EXPECT_VERIFIES(data); |
| 538 ModuleResult result = DecodeModule(data, data + arraysize(data)); | 537 ModuleResult result = DecodeModule(data, data + arraysize(data)); |
| 539 EXPECT_TRUE(result.ok()); | 538 EXPECT_TRUE(result.ok()); |
| 540 EXPECT_EQ(0, result.val->globals.size()); | 539 EXPECT_EQ(0, result.val->globals.size()); |
| 541 EXPECT_EQ(0, result.val->functions.size()); | 540 EXPECT_EQ(0, result.val->functions.size()); |
| 542 EXPECT_EQ(1, result.val->data_segments.size()); | 541 EXPECT_EQ(1, result.val->data_segments.size()); |
| 543 | 542 |
| 544 WasmDataSegment* segment = &result.val->data_segments.back(); | 543 WasmDataSegment* segment = &result.val->data_segments.back(); |
| 545 | 544 |
| 546 EXPECT_EQ(0x9bbaa, segment->dest_addr); | 545 EXPECT_EQ(0x9bbaa, segment->dest_addr); |
| 547 EXPECT_EQ(11, segment->source_offset); | 546 EXPECT_EQ(kDataSegmentSourceOffset, segment->source_offset); |
| 548 EXPECT_EQ(3, segment->source_size); | 547 EXPECT_EQ(3, segment->source_size); |
| 549 EXPECT_TRUE(segment->init); | 548 EXPECT_TRUE(segment->init); |
| 550 | 549 |
| 551 if (result.val) delete result.val; | 550 if (result.val) delete result.val; |
| 552 } | 551 } |
| 553 | 552 |
| 554 EXPECT_OFF_END_FAILURE(data, 5, sizeof(data)); | 553 EXPECT_OFF_END_FAILURE(data, 5, sizeof(data)); |
| 555 } | 554 } |
| 556 | 555 |
| 557 | 556 |
| 558 TEST_F(WasmModuleVerifyTest, TwoDataSegments) { | 557 TEST_F(WasmModuleVerifyTest, TwoDataSegments) { |
| 558 const byte kDataSegment0SourceOffset = 8 + 10; |
| 559 const byte kDataSegment1SourceOffset = 8 + 10 + 8; |
| 560 |
| 559 const byte data[] = { | 561 const byte data[] = { |
| 560 kDeclMemory, 28, 28, 1, kDeclDataSegments, 2, 0xee, 0xff, 0x07, | 562 kDeclMemory, 28, 28, 1, |
| 561 0, // dest addr | 563 kDeclDataSegments, 2, |
| 562 9, 0, 0, | 564 U32V_3(0x7ffee), // #0: dest addr |
| 563 0, // #0: source offset | 565 U32V_1(4), // source size |
| 564 4, 0, 0, | 566 1, 2, 3, 4, // data bytes |
| 565 0, // source size | 567 U32V_3(0x6ddcc), // #1: dest addr |
| 566 0, // init | 568 U32V_1(10), // source size |
| 567 0xcc, 0xdd, 0x06, | 569 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 // data bytes |
| 568 0, // #1: dest addr | |
| 569 6, 0, 0, | |
| 570 0, // source offset | |
| 571 10, 0, 0, | |
| 572 0, // source size | |
| 573 1, // init | |
| 574 }; | 570 }; |
| 575 | 571 |
| 576 { | 572 { |
| 577 ModuleResult result = DecodeModule(data, data + arraysize(data)); | 573 ModuleResult result = DecodeModule(data, data + arraysize(data)); |
| 578 EXPECT_TRUE(result.ok()); | 574 EXPECT_TRUE(result.ok()); |
| 579 EXPECT_EQ(0, result.val->globals.size()); | 575 EXPECT_EQ(0, result.val->globals.size()); |
| 580 EXPECT_EQ(0, result.val->functions.size()); | 576 EXPECT_EQ(0, result.val->functions.size()); |
| 581 EXPECT_EQ(2, result.val->data_segments.size()); | 577 EXPECT_EQ(2, result.val->data_segments.size()); |
| 582 | 578 |
| 583 WasmDataSegment* s0 = &result.val->data_segments[0]; | 579 WasmDataSegment* s0 = &result.val->data_segments[0]; |
| 584 WasmDataSegment* s1 = &result.val->data_segments[1]; | 580 WasmDataSegment* s1 = &result.val->data_segments[1]; |
| 585 | 581 |
| 586 EXPECT_EQ(0x7ffee, s0->dest_addr); | 582 EXPECT_EQ(0x7ffee, s0->dest_addr); |
| 587 EXPECT_EQ(9, s0->source_offset); | 583 EXPECT_EQ(kDataSegment0SourceOffset, s0->source_offset); |
| 588 EXPECT_EQ(4, s0->source_size); | 584 EXPECT_EQ(4, s0->source_size); |
| 589 EXPECT_FALSE(s0->init); | 585 EXPECT_TRUE(s0->init); |
| 590 | 586 |
| 591 EXPECT_EQ(0x6ddcc, s1->dest_addr); | 587 EXPECT_EQ(0x6ddcc, s1->dest_addr); |
| 592 EXPECT_EQ(6, s1->source_offset); | 588 EXPECT_EQ(kDataSegment1SourceOffset, s1->source_offset); |
| 593 EXPECT_EQ(10, s1->source_size); | 589 EXPECT_EQ(10, s1->source_size); |
| 594 EXPECT_TRUE(s1->init); | 590 EXPECT_TRUE(s1->init); |
| 595 | 591 |
| 596 if (result.val) delete result.val; | 592 if (result.val) delete result.val; |
| 597 } | 593 } |
| 598 | 594 |
| 599 EXPECT_OFF_END_FAILURE(data, 5, sizeof(data)); | 595 EXPECT_OFF_END_FAILURE(data, 5, sizeof(data)); |
| 600 } | 596 } |
| 601 | 597 |
| 602 | 598 |
| 603 TEST_F(WasmModuleVerifyTest, DataSegmentWithInvalidSource) { | |
| 604 const int dest_addr = 0x100; | |
| 605 const byte mem_pages = 1; | |
| 606 const int kHeaderSize = 8; | |
| 607 const int kDataSize = 19; | |
| 608 const int kTotalSize = kHeaderSize + kDataSize; | |
| 609 | |
| 610 for (int source_offset = 0; source_offset < 5 + kDataSize; source_offset++) { | |
| 611 for (int source_size = -1; source_size < 5 + kDataSize; source_size += 3) { | |
| 612 byte data[] = { | |
| 613 kDeclMemory, | |
| 614 mem_pages, | |
| 615 mem_pages, | |
| 616 1, | |
| 617 kDeclDataSegments, | |
| 618 1, | |
| 619 U32_LE(dest_addr), | |
| 620 U32_LE(source_offset), | |
| 621 U32_LE(source_size), | |
| 622 1, // init | |
| 623 }; | |
| 624 | |
| 625 STATIC_ASSERT(kDataSize == arraysize(data)); | |
| 626 | |
| 627 if (source_offset < kTotalSize && source_size >= 0 && | |
| 628 (source_offset + source_size) <= kTotalSize) { | |
| 629 EXPECT_VERIFIES(data); | |
| 630 } else { | |
| 631 EXPECT_FAILURE(data); | |
| 632 } | |
| 633 } | |
| 634 } | |
| 635 } | |
| 636 | |
| 637 | |
| 638 TEST_F(WasmModuleVerifyTest, DataSegmentWithInvalidDest) { | 599 TEST_F(WasmModuleVerifyTest, DataSegmentWithInvalidDest) { |
| 639 const int source_size = 3; | 600 const int source_size = 3; |
| 640 const int source_offset = 11; | |
| 641 | 601 |
| 642 for (byte mem_pages = 1; mem_pages < 16; mem_pages++) { | 602 for (byte mem_pages = 1; mem_pages < 16; mem_pages++) { |
| 643 int mem_size = mem_pages * 0x10000; // 64k pages. | 603 int mem_size = mem_pages * 0x10000; // 64k pages. |
| 644 | 604 |
| 645 for (int dest_addr = mem_size - source_size; | 605 for (int dest_addr = mem_size - source_size; |
| 646 dest_addr < mem_size + source_size; dest_addr++) { | 606 dest_addr < mem_size + source_size; dest_addr++) { |
| 647 byte data[] = { | 607 byte data[] = { |
| 648 kDeclMemory, | 608 kDeclMemory, |
| 649 mem_pages, | 609 mem_pages, |
| 650 mem_pages, | 610 mem_pages, |
| 651 1, | 611 1, |
| 652 kDeclDataSegments, | 612 kDeclDataSegments, |
| 653 1, | 613 1, |
| 654 U32_LE(dest_addr), | 614 U32V_3(dest_addr), |
| 655 U32_LE(source_offset), | 615 U32V_1(source_size), |
| 656 U32_LE(source_size), | 616 'a', 'b', 'c' |
| 657 1, // init | |
| 658 }; | 617 }; |
| 659 | 618 |
| 660 if (dest_addr <= (mem_size - source_size)) { | 619 if (dest_addr <= (mem_size - source_size)) { |
| 661 EXPECT_VERIFIES(data); | 620 EXPECT_VERIFIES(data); |
| 662 } else { | 621 } else { |
| 663 EXPECT_FAILURE(data); | 622 EXPECT_FAILURE(data); |
| 664 } | 623 } |
| 665 } | 624 } |
| 666 } | 625 } |
| 667 } | 626 } |
| (...skipping 531 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1199 for (int length = 13; length < sizeof(data); length++) { | 1158 for (int length = 13; length < sizeof(data); length++) { |
| 1200 ModuleResult result = DecodeModule(data, data + length); | 1159 ModuleResult result = DecodeModule(data, data + length); |
| 1201 EXPECT_FALSE(result.ok()); | 1160 EXPECT_FALSE(result.ok()); |
| 1202 if (result.val) delete result.val; | 1161 if (result.val) delete result.val; |
| 1203 } | 1162 } |
| 1204 } | 1163 } |
| 1205 | 1164 |
| 1206 } // namespace wasm | 1165 } // namespace wasm |
| 1207 } // namespace internal | 1166 } // namespace internal |
| 1208 } // namespace v8 | 1167 } // namespace v8 |
| OLD | NEW |