Commit 4421c6c
authored
[interp] Use u64 table operands so out-of-range table64 indices trap (#2760)
On a table declared with the i64 index type, an index past the end of
the table does not trap as it should:
$ wasm-interp --enable-memory64 --run-all-exports t.wasm
get_oob() => funcref:0
The table has 10 slots and the index was `(i64.const 0x1_0000_0003)`.
That is out of bounds, but it read slot 3.
table.get/set/fill/copy/init/grow pop their operands as u64 for an i64
table (PopPtr), then pass them to Table::Get/Set/Fill/Copy/Init/Grow,
which take u32. The high half is dropped, so any index in [2^32, 2^32 +
size) wraps to an in-range slot and the bounds check passes. table.set
overwrites a live entry that way, and table.grow truncates a delta above
2^32 and reports success instead of failing.
Memory already takes u64 throughout for memory64, so this widens the
Table side to match and rejects a grow delta that does not fit in u32.
Behaviour for i32 tables is byte-identical. Added an interp test
covering the wrap window.1 parent 71acc6d commit 4421c6c
3 files changed
Lines changed: 57 additions & 21 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
827 | 827 | | |
828 | 828 | | |
829 | 829 | | |
830 | | - | |
| 830 | + | |
831 | 831 | | |
832 | | - | |
833 | | - | |
834 | | - | |
835 | | - | |
| 832 | + | |
| 833 | + | |
| 834 | + | |
| 835 | + | |
836 | 836 | | |
837 | | - | |
| 837 | + | |
838 | 838 | | |
839 | 839 | | |
840 | 840 | | |
841 | 841 | | |
842 | 842 | | |
843 | | - | |
| 843 | + | |
844 | 844 | | |
845 | | - | |
846 | | - | |
| 845 | + | |
| 846 | + | |
847 | 847 | | |
848 | 848 | | |
849 | | - | |
| 849 | + | |
850 | 850 | | |
851 | 851 | | |
852 | 852 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
19 | 19 | | |
20 | 20 | | |
21 | 21 | | |
| 22 | + | |
22 | 23 | | |
23 | 24 | | |
24 | 25 | | |
| |||
593 | 594 | | |
594 | 595 | | |
595 | 596 | | |
596 | | - | |
| 597 | + | |
597 | 598 | | |
598 | 599 | | |
599 | 600 | | |
600 | 601 | | |
601 | | - | |
| 602 | + | |
602 | 603 | | |
603 | 604 | | |
604 | 605 | | |
605 | 606 | | |
606 | 607 | | |
607 | 608 | | |
608 | 609 | | |
609 | | - | |
| 610 | + | |
610 | 611 | | |
611 | 612 | | |
612 | 613 | | |
613 | 614 | | |
614 | | - | |
| 615 | + | |
615 | 616 | | |
616 | 617 | | |
617 | 618 | | |
| |||
620 | 621 | | |
621 | 622 | | |
622 | 623 | | |
623 | | - | |
| 624 | + | |
624 | 625 | | |
625 | 626 | | |
626 | 627 | | |
627 | | - | |
| 628 | + | |
| 629 | + | |
| 630 | + | |
| 631 | + | |
| 632 | + | |
| 633 | + | |
| 634 | + | |
| 635 | + | |
628 | 636 | | |
629 | 637 | | |
630 | 638 | | |
| |||
635 | 643 | | |
636 | 644 | | |
637 | 645 | | |
638 | | - | |
| 646 | + | |
639 | 647 | | |
640 | 648 | | |
641 | 649 | | |
| |||
646 | 654 | | |
647 | 655 | | |
648 | 656 | | |
649 | | - | |
| 657 | + | |
650 | 658 | | |
651 | 659 | | |
652 | 660 | | |
| |||
663 | 671 | | |
664 | 672 | | |
665 | 673 | | |
666 | | - | |
| 674 | + | |
667 | 675 | | |
668 | | - | |
669 | | - | |
| 676 | + | |
| 677 | + | |
670 | 678 | | |
671 | 679 | | |
672 | 680 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
0 commit comments