Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(7)

Side by Side Diff: test/unittests/wasm/decoder-unittest.cc

Issue 2052623003: [wasm] improve handling of malformed input (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: add overflow check to BranchTableOperand Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2016 the V8 project authors. All rights reserved. 1 // Copyright 2016 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/decoder.h" 7 #include "src/wasm/decoder.h"
8 #include "src/wasm/wasm-macro-gen.h" 8 #include "src/wasm/wasm-macro-gen.h"
9 9
10 namespace v8 { 10 namespace v8 {
11 namespace internal { 11 namespace internal {
12 namespace wasm { 12 namespace wasm {
13 13
14 class DecoderTest : public TestWithZone { 14 class DecoderTest : public TestWithZone {
15 public: 15 public:
16 DecoderTest() : decoder(nullptr, nullptr) {} 16 DecoderTest() : decoder(nullptr, nullptr) {}
17 17
18 Decoder decoder; 18 Decoder decoder;
19 }; 19 };
20 20
21 #define CHECK_UINT32V_INLINE(expected, expected_length, ...) \ 21 #define CHECK_UINT32V_INLINE(expected, expected_length, ...) \
22 do { \ 22 do { \
23 const byte data[] = {__VA_ARGS__}; \ 23 const byte data[] = {__VA_ARGS__}; \
24 decoder.Reset(data, data + sizeof(data)); \ 24 decoder.Reset(data, data + sizeof(data)); \
25 int length; \ 25 unsigned length; \
26 EXPECT_EQ(expected, \ 26 EXPECT_EQ(expected, \
27 decoder.checked_read_u32v(decoder.start(), 0, &length)); \ 27 decoder.checked_read_u32v(decoder.start(), 0, &length)); \
28 EXPECT_EQ(expected_length, length); \ 28 EXPECT_EQ(expected_length, length); \
29 } while (false) 29 } while (false)
30 30
31 #define CHECK_INT32V_INLINE(expected, expected_length, ...) \ 31 #define CHECK_INT32V_INLINE(expected, expected_length, ...) \
32 do { \ 32 do { \
33 const byte data[] = {__VA_ARGS__}; \ 33 const byte data[] = {__VA_ARGS__}; \
34 decoder.Reset(data, data + sizeof(data)); \ 34 decoder.Reset(data, data + sizeof(data)); \
35 int length; \ 35 unsigned length; \
36 EXPECT_EQ(expected, \ 36 EXPECT_EQ(expected, \
37 decoder.checked_read_i32v(decoder.start(), 0, &length)); \ 37 decoder.checked_read_i32v(decoder.start(), 0, &length)); \
38 EXPECT_EQ(expected_length, length); \ 38 EXPECT_EQ(expected_length, length); \
39 } while (false) 39 } while (false)
40 40
41 #define CHECK_UINT64V_INLINE(expected, expected_length, ...) \ 41 #define CHECK_UINT64V_INLINE(expected, expected_length, ...) \
42 do { \ 42 do { \
43 const byte data[] = {__VA_ARGS__}; \ 43 const byte data[] = {__VA_ARGS__}; \
44 decoder.Reset(data, data + sizeof(data)); \ 44 decoder.Reset(data, data + sizeof(data)); \
45 int length; \ 45 unsigned length; \
46 EXPECT_EQ(expected, \ 46 EXPECT_EQ(expected, \
47 decoder.checked_read_u64v(decoder.start(), 0, &length)); \ 47 decoder.checked_read_u64v(decoder.start(), 0, &length)); \
48 EXPECT_EQ(expected_length, length); \ 48 EXPECT_EQ(expected_length, length); \
49 } while (false) 49 } while (false)
50 50
51 #define CHECK_INT64V_INLINE(expected, expected_length, ...) \ 51 #define CHECK_INT64V_INLINE(expected, expected_length, ...) \
52 do { \ 52 do { \
53 const byte data[] = {__VA_ARGS__}; \ 53 const byte data[] = {__VA_ARGS__}; \
54 decoder.Reset(data, data + sizeof(data)); \ 54 decoder.Reset(data, data + sizeof(data)); \
55 int length; \ 55 unsigned length; \
56 EXPECT_EQ(expected, \ 56 EXPECT_EQ(expected, \
57 decoder.checked_read_i64v(decoder.start(), 0, &length)); \ 57 decoder.checked_read_i64v(decoder.start(), 0, &length)); \
58 EXPECT_EQ(expected_length, length); \ 58 EXPECT_EQ(expected_length, length); \
59 } while (false) 59 } while (false)
60 60
61 TEST_F(DecoderTest, ReadU32v_OneByte) { 61 TEST_F(DecoderTest, ReadU32v_OneByte) {
62 CHECK_UINT32V_INLINE(0, 1, 0); 62 CHECK_UINT32V_INLINE(0, 1, 0);
63 CHECK_UINT32V_INLINE(5, 1, 5); 63 CHECK_UINT32V_INLINE(5, 1, 5);
64 CHECK_UINT32V_INLINE(7, 1, 7); 64 CHECK_UINT32V_INLINE(7, 1, 7);
65 CHECK_UINT32V_INLINE(9, 1, 9); 65 CHECK_UINT32V_INLINE(9, 1, 9);
(...skipping 292 matching lines...) Expand 10 before | Expand all | Expand 10 after
358 } 358 }
359 359
360 const int32_t max = kMaxInt; 360 const int32_t max = kMaxInt;
361 for (int i = max; i > max - 10; i--) { 361 for (int i = max; i > max - 10; i--) {
362 CHECK_INT32V_INLINE(i, 5, U32V_5(i)); 362 CHECK_INT32V_INLINE(i, 5, U32V_5(i));
363 } 363 }
364 } 364 }
365 365
366 TEST_F(DecoderTest, ReadU32v_off_end1) { 366 TEST_F(DecoderTest, ReadU32v_off_end1) {
367 static const byte data[] = {U32V_1(11)}; 367 static const byte data[] = {U32V_1(11)};
368 int length = 0; 368 unsigned length = 0;
369 decoder.Reset(data, data); 369 decoder.Reset(data, data);
370 decoder.checked_read_u32v(decoder.start(), 0, &length); 370 decoder.checked_read_u32v(decoder.start(), 0, &length);
371 EXPECT_EQ(0, length); 371 EXPECT_EQ(0, length);
372 EXPECT_FALSE(decoder.ok()); 372 EXPECT_FALSE(decoder.ok());
373 } 373 }
374 374
375 TEST_F(DecoderTest, ReadU32v_off_end2) { 375 TEST_F(DecoderTest, ReadU32v_off_end2) {
376 static const byte data[] = {U32V_2(1111)}; 376 static const byte data[] = {U32V_2(1111)};
377 for (size_t i = 0; i < sizeof(data); i++) { 377 for (size_t i = 0; i < sizeof(data); i++) {
378 int length = 0; 378 unsigned length = 0;
379 decoder.Reset(data, data + i); 379 decoder.Reset(data, data + i);
380 decoder.checked_read_u32v(decoder.start(), 0, &length); 380 decoder.checked_read_u32v(decoder.start(), 0, &length);
381 EXPECT_EQ(i, length); 381 EXPECT_EQ(i, length);
382 EXPECT_FALSE(decoder.ok()); 382 EXPECT_FALSE(decoder.ok());
383 } 383 }
384 } 384 }
385 385
386 TEST_F(DecoderTest, ReadU32v_off_end3) { 386 TEST_F(DecoderTest, ReadU32v_off_end3) {
387 static const byte data[] = {U32V_3(111111)}; 387 static const byte data[] = {U32V_3(111111)};
388 for (size_t i = 0; i < sizeof(data); i++) { 388 for (size_t i = 0; i < sizeof(data); i++) {
389 int length = 0; 389 unsigned length = 0;
390 decoder.Reset(data, data + i); 390 decoder.Reset(data, data + i);
391 decoder.checked_read_u32v(decoder.start(), 0, &length); 391 decoder.checked_read_u32v(decoder.start(), 0, &length);
392 EXPECT_EQ(i, length); 392 EXPECT_EQ(i, length);
393 EXPECT_FALSE(decoder.ok()); 393 EXPECT_FALSE(decoder.ok());
394 } 394 }
395 } 395 }
396 396
397 TEST_F(DecoderTest, ReadU32v_off_end4) { 397 TEST_F(DecoderTest, ReadU32v_off_end4) {
398 static const byte data[] = {U32V_4(11111111)}; 398 static const byte data[] = {U32V_4(11111111)};
399 for (size_t i = 0; i < sizeof(data); i++) { 399 for (size_t i = 0; i < sizeof(data); i++) {
400 int length = 0; 400 unsigned length = 0;
401 decoder.Reset(data, data + i); 401 decoder.Reset(data, data + i);
402 decoder.checked_read_u32v(decoder.start(), 0, &length); 402 decoder.checked_read_u32v(decoder.start(), 0, &length);
403 EXPECT_EQ(i, length); 403 EXPECT_EQ(i, length);
404 EXPECT_FALSE(decoder.ok()); 404 EXPECT_FALSE(decoder.ok());
405 } 405 }
406 } 406 }
407 407
408 TEST_F(DecoderTest, ReadU32v_off_end5) { 408 TEST_F(DecoderTest, ReadU32v_off_end5) {
409 static const byte data[] = {U32V_5(111111111)}; 409 static const byte data[] = {U32V_5(111111111)};
410 for (size_t i = 0; i < sizeof(data); i++) { 410 for (size_t i = 0; i < sizeof(data); i++) {
411 int length = 0; 411 unsigned length = 0;
412 decoder.Reset(data, data + i); 412 decoder.Reset(data, data + i);
413 decoder.checked_read_u32v(decoder.start(), 0, &length); 413 decoder.checked_read_u32v(decoder.start(), 0, &length);
414 EXPECT_EQ(i, length); 414 EXPECT_EQ(i, length);
415 EXPECT_FALSE(decoder.ok()); 415 EXPECT_FALSE(decoder.ok());
416 } 416 }
417 } 417 }
418 418
419 TEST_F(DecoderTest, ReadU32v_extra_bits) { 419 TEST_F(DecoderTest, ReadU32v_extra_bits) {
420 byte data[] = {0x80, 0x80, 0x80, 0x80, 0x00}; 420 byte data[] = {0x80, 0x80, 0x80, 0x80, 0x00};
421 for (int i = 1; i < 16; i++) { 421 for (int i = 1; i < 16; i++) {
422 data[4] = static_cast<byte>(i << 4); 422 data[4] = static_cast<byte>(i << 4);
423 int length = 0; 423 unsigned length = 0;
424 decoder.Reset(data, data + sizeof(data)); 424 decoder.Reset(data, data + sizeof(data));
425 decoder.checked_read_u32v(decoder.start(), 0, &length); 425 decoder.checked_read_u32v(decoder.start(), 0, &length);
426 EXPECT_EQ(5, length); 426 EXPECT_EQ(5, length);
427 EXPECT_FALSE(decoder.ok()); 427 EXPECT_FALSE(decoder.ok());
428 } 428 }
429 } 429 }
430 430
431 TEST_F(DecoderTest, ReadI32v_extra_bits_negative) { 431 TEST_F(DecoderTest, ReadI32v_extra_bits_negative) {
432 // OK for negative signed values to have extra ones. 432 // OK for negative signed values to have extra ones.
433 int length = 0; 433 unsigned length = 0;
434 byte data[] = {0xff, 0xff, 0xff, 0xff, 0x7f}; 434 byte data[] = {0xff, 0xff, 0xff, 0xff, 0x7f};
435 decoder.Reset(data, data + sizeof(data)); 435 decoder.Reset(data, data + sizeof(data));
436 decoder.checked_read_i32v(decoder.start(), 0, &length); 436 decoder.checked_read_i32v(decoder.start(), 0, &length);
437 EXPECT_EQ(5, length); 437 EXPECT_EQ(5, length);
438 EXPECT_TRUE(decoder.ok()); 438 EXPECT_TRUE(decoder.ok());
439 } 439 }
440 440
441 TEST_F(DecoderTest, ReadI32v_extra_bits_positive) { 441 TEST_F(DecoderTest, ReadI32v_extra_bits_positive) {
442 // Not OK for positive signed values to have extra ones. 442 // Not OK for positive signed values to have extra ones.
443 int length = 0; 443 unsigned length = 0;
444 byte data[] = {0x80, 0x80, 0x80, 0x80, 0x77}; 444 byte data[] = {0x80, 0x80, 0x80, 0x80, 0x77};
445 decoder.Reset(data, data + sizeof(data)); 445 decoder.Reset(data, data + sizeof(data));
446 decoder.checked_read_i32v(decoder.start(), 0, &length); 446 decoder.checked_read_i32v(decoder.start(), 0, &length);
447 EXPECT_EQ(5, length); 447 EXPECT_EQ(5, length);
448 EXPECT_FALSE(decoder.ok()); 448 EXPECT_FALSE(decoder.ok());
449 } 449 }
450 450
451 TEST_F(DecoderTest, ReadU32v_Bits) { 451 TEST_F(DecoderTest, ReadU32v_Bits) {
452 // A more exhaustive test. 452 // A more exhaustive test.
453 const int kMaxSize = 5; 453 const int kMaxSize = 5;
(...skipping 16 matching lines...) Expand all
470 for (int j = 0; j < kMaxSize; j++) { 470 for (int j = 0; j < kMaxSize; j++) {
471 data[j] = static_cast<byte>((val >> (7 * j)) & MASK_7); 471 data[j] = static_cast<byte>((val >> (7 * j)) & MASK_7);
472 } 472 }
473 for (int j = 0; j < length - 1; j++) { 473 for (int j = 0; j < length - 1; j++) {
474 data[j] |= 0x80; 474 data[j] |= 0x80;
475 } 475 }
476 476
477 // foreach buffer size 0...5 477 // foreach buffer size 0...5
478 for (int limit = 0; limit <= kMaxSize; limit++) { 478 for (int limit = 0; limit <= kMaxSize; limit++) {
479 decoder.Reset(data, data + limit); 479 decoder.Reset(data, data + limit);
480 int rlen; 480 unsigned rlen;
481 uint32_t result = decoder.checked_read_u32v(data, 0, &rlen); 481 uint32_t result = decoder.checked_read_u32v(data, 0, &rlen);
482 if (limit < length) { 482 if (limit < length) {
483 EXPECT_FALSE(decoder.ok()); 483 EXPECT_FALSE(decoder.ok());
484 } else { 484 } else {
485 EXPECT_TRUE(decoder.ok()); 485 EXPECT_TRUE(decoder.ok());
486 EXPECT_EQ(val, result); 486 EXPECT_EQ(val, result);
487 EXPECT_EQ(length, rlen); 487 EXPECT_EQ(length, rlen);
488 } 488 }
489 } 489 }
490 } 490 }
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
526 byte data[kMaxSize]; 526 byte data[kMaxSize];
527 527
528 for (int i = 0; i < 64; i++) { 528 for (int i = 0; i < 64; i++) {
529 const uint64_t val = 1ull << i; 529 const uint64_t val = 1ull << i;
530 int index = i / 7; 530 int index = i / 7;
531 data[index] = 1 << (i % 7); 531 data[index] = 1 << (i % 7);
532 memset(data, 0x80, index); 532 memset(data, 0x80, index);
533 533
534 for (int limit = 0; limit <= kMaxSize; limit++) { 534 for (int limit = 0; limit <= kMaxSize; limit++) {
535 decoder.Reset(data, data + limit); 535 decoder.Reset(data, data + limit);
536 int length; 536 unsigned length;
537 uint64_t result = decoder.checked_read_u64v(data, 0, &length); 537 uint64_t result = decoder.checked_read_u64v(data, 0, &length);
538 if (limit <= index) { 538 if (limit <= index) {
539 EXPECT_FALSE(decoder.ok()); 539 EXPECT_FALSE(decoder.ok());
540 } else { 540 } else {
541 EXPECT_TRUE(decoder.ok()); 541 EXPECT_TRUE(decoder.ok());
542 EXPECT_EQ(val, result); 542 EXPECT_EQ(val, result);
543 EXPECT_EQ(index + 1, length); 543 EXPECT_EQ(index + 1, length);
544 } 544 }
545 } 545 }
546 } 546 }
(...skipping 20 matching lines...) Expand all
567 for (int j = 0; j < kMaxSize; j++) { 567 for (int j = 0; j < kMaxSize; j++) {
568 data[j] = static_cast<byte>((val >> (7 * j)) & MASK_7); 568 data[j] = static_cast<byte>((val >> (7 * j)) & MASK_7);
569 } 569 }
570 for (int j = 0; j < length - 1; j++) { 570 for (int j = 0; j < length - 1; j++) {
571 data[j] |= 0x80; 571 data[j] |= 0x80;
572 } 572 }
573 573
574 // foreach buffer size 0...10 574 // foreach buffer size 0...10
575 for (int limit = 0; limit <= kMaxSize; limit++) { 575 for (int limit = 0; limit <= kMaxSize; limit++) {
576 decoder.Reset(data, data + limit); 576 decoder.Reset(data, data + limit);
577 int rlen; 577 unsigned rlen;
578 uint64_t result = decoder.checked_read_u64v(data, 0, &rlen); 578 uint64_t result = decoder.checked_read_u64v(data, 0, &rlen);
579 if (limit < length) { 579 if (limit < length) {
580 EXPECT_FALSE(decoder.ok()); 580 EXPECT_FALSE(decoder.ok());
581 } else { 581 } else {
582 EXPECT_TRUE(decoder.ok()); 582 EXPECT_TRUE(decoder.ok());
583 EXPECT_EQ(val, result); 583 EXPECT_EQ(val, result);
584 EXPECT_EQ(length, rlen); 584 EXPECT_EQ(length, rlen);
585 } 585 }
586 } 586 }
587 } 587 }
(...skipping 21 matching lines...) Expand all
609 for (int j = 0; j < kMaxSize; j++) { 609 for (int j = 0; j < kMaxSize; j++) {
610 data[j] = static_cast<byte>((val >> (7 * j)) & MASK_7); 610 data[j] = static_cast<byte>((val >> (7 * j)) & MASK_7);
611 } 611 }
612 for (int j = 0; j < length - 1; j++) { 612 for (int j = 0; j < length - 1; j++) {
613 data[j] |= 0x80; 613 data[j] |= 0x80;
614 } 614 }
615 615
616 // foreach buffer size 0...10 616 // foreach buffer size 0...10
617 for (int limit = 0; limit <= kMaxSize; limit++) { 617 for (int limit = 0; limit <= kMaxSize; limit++) {
618 decoder.Reset(data, data + limit); 618 decoder.Reset(data, data + limit);
619 int rlen; 619 unsigned rlen;
620 int64_t result = decoder.checked_read_i64v(data, 0, &rlen); 620 int64_t result = decoder.checked_read_i64v(data, 0, &rlen);
621 if (limit < length) { 621 if (limit < length) {
622 EXPECT_FALSE(decoder.ok()); 622 EXPECT_FALSE(decoder.ok());
623 } else { 623 } else {
624 EXPECT_TRUE(decoder.ok()); 624 EXPECT_TRUE(decoder.ok());
625 EXPECT_EQ(val, result); 625 EXPECT_EQ(val, result);
626 EXPECT_EQ(length, rlen); 626 EXPECT_EQ(length, rlen);
627 } 627 }
628 } 628 }
629 } 629 }
630 } 630 }
631 } 631 }
632 632
633 TEST_F(DecoderTest, ReadU64v_extra_bits) { 633 TEST_F(DecoderTest, ReadU64v_extra_bits) {
634 byte data[] = {0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00}; 634 byte data[] = {0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00};
635 for (int i = 1; i < 128; i++) { 635 for (int i = 1; i < 128; i++) {
636 data[9] = static_cast<byte>(i << 1); 636 data[9] = static_cast<byte>(i << 1);
637 int length = 0; 637 unsigned length = 0;
638 decoder.Reset(data, data + sizeof(data)); 638 decoder.Reset(data, data + sizeof(data));
639 decoder.checked_read_u64v(decoder.start(), 0, &length); 639 decoder.checked_read_u64v(decoder.start(), 0, &length);
640 EXPECT_EQ(10, length); 640 EXPECT_EQ(10, length);
641 EXPECT_FALSE(decoder.ok()); 641 EXPECT_FALSE(decoder.ok());
642 } 642 }
643 } 643 }
644 644
645 TEST_F(DecoderTest, ReadI64v_extra_bits_negative) { 645 TEST_F(DecoderTest, ReadI64v_extra_bits_negative) {
646 // OK for negative signed values to have extra ones. 646 // OK for negative signed values to have extra ones.
647 int length = 0; 647 unsigned length = 0;
648 byte data[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f}; 648 byte data[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f};
649 decoder.Reset(data, data + sizeof(data)); 649 decoder.Reset(data, data + sizeof(data));
650 decoder.checked_read_i64v(decoder.start(), 0, &length); 650 decoder.checked_read_i64v(decoder.start(), 0, &length);
651 EXPECT_EQ(10, length); 651 EXPECT_EQ(10, length);
652 EXPECT_TRUE(decoder.ok()); 652 EXPECT_TRUE(decoder.ok());
653 } 653 }
654 654
655 TEST_F(DecoderTest, ReadI64v_extra_bits_positive) { 655 TEST_F(DecoderTest, ReadI64v_extra_bits_positive) {
656 // Not OK for positive signed values to have extra ones. 656 // Not OK for positive signed values to have extra ones.
657 int length = 0; 657 unsigned length = 0;
658 byte data[] = {0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x77}; 658 byte data[] = {0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x77};
659 decoder.Reset(data, data + sizeof(data)); 659 decoder.Reset(data, data + sizeof(data));
660 decoder.checked_read_i64v(decoder.start(), 0, &length); 660 decoder.checked_read_i64v(decoder.start(), 0, &length);
661 EXPECT_EQ(10, length); 661 EXPECT_EQ(10, length);
662 EXPECT_FALSE(decoder.ok()); 662 EXPECT_FALSE(decoder.ok());
663 } 663 }
664 664
665 } // namespace wasm 665 } // namespace wasm
666 } // namespace internal 666 } // namespace internal
667 } // namespace v8 667 } // namespace v8
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698