Skip to content

Commit

Permalink
Add test ensuring data segment index is unsigned (WebAssembly#136)
Browse files Browse the repository at this point in the history
Decoding 64 as an signed LEB will produce the value -64 = 4294967232.
This change adds tests to ensure that the segment is decoded as 64.
  • Loading branch information
binji authored Jan 28, 2020
1 parent 97dec20 commit 11388e7
Show file tree
Hide file tree
Showing 5 changed files with 126 additions and 0 deletions.
40 changes: 40 additions & 0 deletions test/core/bulk.wast
Original file line number Diff line number Diff line change
Expand Up @@ -176,6 +176,22 @@
(assert_trap (invoke "init_active" (i32.const 1)) "out of bounds")
(invoke "init_active" (i32.const 0))

;; Test that the data segment index is properly encoded as an unsigned (not
;; signed) LEB.
(module
(memory 1)
;; 65 data segments. 64 is the smallest positive number that is encoded
;; differently as a signed LEB.
(data "") (data "") (data "") (data "") (data "") (data "") (data "") (data "")
(data "") (data "") (data "") (data "") (data "") (data "") (data "") (data "")
(data "") (data "") (data "") (data "") (data "") (data "") (data "") (data "")
(data "") (data "") (data "") (data "") (data "") (data "") (data "") (data "")
(data "") (data "") (data "") (data "") (data "") (data "") (data "") (data "")
(data "") (data "") (data "") (data "") (data "") (data "") (data "") (data "")
(data "") (data "") (data "") (data "") (data "") (data "") (data "") (data "")
(data "") (data "") (data "") (data "") (data "") (data "") (data "") (data "")
(data "")
(func (data.drop 64)))

;; table.init
(module
Expand Down Expand Up @@ -251,6 +267,30 @@
(assert_trap (invoke "init_active" (i32.const 1)) "out of bounds")
(invoke "init_active" (i32.const 0))

;; Test that the elem segment index is properly encoded as an unsigned (not
;; signed) LEB.
(module
(table 1 funcref)
;; 65 elem segments. 64 is the smallest positive number that is encoded
;; differently as a signed LEB.
(elem funcref) (elem funcref) (elem funcref) (elem funcref)
(elem funcref) (elem funcref) (elem funcref) (elem funcref)
(elem funcref) (elem funcref) (elem funcref) (elem funcref)
(elem funcref) (elem funcref) (elem funcref) (elem funcref)
(elem funcref) (elem funcref) (elem funcref) (elem funcref)
(elem funcref) (elem funcref) (elem funcref) (elem funcref)
(elem funcref) (elem funcref) (elem funcref) (elem funcref)
(elem funcref) (elem funcref) (elem funcref) (elem funcref)
(elem funcref) (elem funcref) (elem funcref) (elem funcref)
(elem funcref) (elem funcref) (elem funcref) (elem funcref)
(elem funcref) (elem funcref) (elem funcref) (elem funcref)
(elem funcref) (elem funcref) (elem funcref) (elem funcref)
(elem funcref) (elem funcref) (elem funcref) (elem funcref)
(elem funcref) (elem funcref) (elem funcref) (elem funcref)
(elem funcref) (elem funcref) (elem funcref) (elem funcref)
(elem funcref) (elem funcref) (elem funcref) (elem funcref)
(elem funcref)
(func (elem.drop 64)))

;; table.copy
(module
Expand Down
16 changes: 16 additions & 0 deletions test/core/memory_init.wast
Original file line number Diff line number Diff line change
Expand Up @@ -949,3 +949,19 @@

(assert_return (invoke "checkRange" (i32.const 0) (i32.const 1) (i32.const 0))
(i32.const -1))

(module
(memory 1)
;; 65 data segments. 64 is the smallest positive number that is encoded
;; differently as a signed LEB.
(data "") (data "") (data "") (data "") (data "") (data "") (data "") (data "")
(data "") (data "") (data "") (data "") (data "") (data "") (data "") (data "")
(data "") (data "") (data "") (data "") (data "") (data "") (data "") (data "")
(data "") (data "") (data "") (data "") (data "") (data "") (data "") (data "")
(data "") (data "") (data "") (data "") (data "") (data "") (data "") (data "")
(data "") (data "") (data "") (data "") (data "") (data "") (data "") (data "")
(data "") (data "") (data "") (data "") (data "") (data "") (data "") (data "")
(data "") (data "") (data "") (data "") (data "") (data "") (data "") (data "")
(data "")
(func (memory.init 64 (i32.const 0) (i32.const 0) (i32.const 0))))

24 changes: 24 additions & 0 deletions test/core/table_init.wast
Original file line number Diff line number Diff line change
Expand Up @@ -1750,3 +1750,27 @@
(assert_trap (invoke "test" (i32.const 13)) "uninitialized element")
(assert_trap (invoke "test" (i32.const 14)) "uninitialized element")
(assert_trap (invoke "test" (i32.const 15)) "uninitialized element")

(module
(table 1 funcref)
;; 65 elem segments. 64 is the smallest positive number that is encoded
;; differently as a signed LEB.
(elem funcref) (elem funcref) (elem funcref) (elem funcref)
(elem funcref) (elem funcref) (elem funcref) (elem funcref)
(elem funcref) (elem funcref) (elem funcref) (elem funcref)
(elem funcref) (elem funcref) (elem funcref) (elem funcref)
(elem funcref) (elem funcref) (elem funcref) (elem funcref)
(elem funcref) (elem funcref) (elem funcref) (elem funcref)
(elem funcref) (elem funcref) (elem funcref) (elem funcref)
(elem funcref) (elem funcref) (elem funcref) (elem funcref)
(elem funcref) (elem funcref) (elem funcref) (elem funcref)
(elem funcref) (elem funcref) (elem funcref) (elem funcref)
(elem funcref) (elem funcref) (elem funcref) (elem funcref)
(elem funcref) (elem funcref) (elem funcref) (elem funcref)
(elem funcref) (elem funcref) (elem funcref) (elem funcref)
(elem funcref) (elem funcref) (elem funcref) (elem funcref)
(elem funcref) (elem funcref) (elem funcref) (elem funcref)
(elem funcref) (elem funcref) (elem funcref) (elem funcref)
(elem funcref)
(func (table.init 64 (i32.const 0) (i32.const 0) (i32.const 0))))

19 changes: 19 additions & 0 deletions test/meta/generate_memory_init.js
Original file line number Diff line number Diff line change
Expand Up @@ -292,3 +292,22 @@ mem_init(1, "", "", Math.floor(mem_init_len/2), 0xFFFFFF00);
// We arithmetically overflow the segment limit but not the memory limit
mem_init(1, "", "", PAGESIZE, 0xFFFFFFFC);

// Test that the data segment index is properly encoded as an unsigned (not
// signed) LEB.
print(
`
(module
(memory 1)
;; 65 data segments. 64 is the smallest positive number that is encoded
;; differently as a signed LEB.
(data "") (data "") (data "") (data "") (data "") (data "") (data "") (data "")
(data "") (data "") (data "") (data "") (data "") (data "") (data "") (data "")
(data "") (data "") (data "") (data "") (data "") (data "") (data "") (data "")
(data "") (data "") (data "") (data "") (data "") (data "") (data "") (data "")
(data "") (data "") (data "") (data "") (data "") (data "") (data "") (data "")
(data "") (data "") (data "") (data "") (data "") (data "") (data "") (data "")
(data "") (data "") (data "") (data "") (data "") (data "") (data "") (data "")
(data "") (data "") (data "") (data "") (data "") (data "") (data "") (data "")
(data "")
(func (memory.init 64 (i32.const 0) (i32.const 0) (i32.const 0))))
`)
27 changes: 27 additions & 0 deletions test/meta/generate_table_init.js
Original file line number Diff line number Diff line change
Expand Up @@ -336,3 +336,30 @@ tbl_init(tbl_init_len*4, tbl_init_len*4, tbl_init_len, 0xFFFFFFF0);
// We arithmetically overflow the segment limit but not the table limit
tbl_init(tbl_init_len, tbl_init_len, tbl_init_len, 0xFFFFFFFC, Math.floor(tbl_init_len/2));

// Test that the elem segment index is properly encoded as an unsigned (not
// signed) LEB.
print(
`
(module
(table 1 funcref)
;; 65 elem segments. 64 is the smallest positive number that is encoded
;; differently as a signed LEB.
(elem funcref) (elem funcref) (elem funcref) (elem funcref)
(elem funcref) (elem funcref) (elem funcref) (elem funcref)
(elem funcref) (elem funcref) (elem funcref) (elem funcref)
(elem funcref) (elem funcref) (elem funcref) (elem funcref)
(elem funcref) (elem funcref) (elem funcref) (elem funcref)
(elem funcref) (elem funcref) (elem funcref) (elem funcref)
(elem funcref) (elem funcref) (elem funcref) (elem funcref)
(elem funcref) (elem funcref) (elem funcref) (elem funcref)
(elem funcref) (elem funcref) (elem funcref) (elem funcref)
(elem funcref) (elem funcref) (elem funcref) (elem funcref)
(elem funcref) (elem funcref) (elem funcref) (elem funcref)
(elem funcref) (elem funcref) (elem funcref) (elem funcref)
(elem funcref) (elem funcref) (elem funcref) (elem funcref)
(elem funcref) (elem funcref) (elem funcref) (elem funcref)
(elem funcref) (elem funcref) (elem funcref) (elem funcref)
(elem funcref) (elem funcref) (elem funcref) (elem funcref)
(elem funcref)
(func (table.init 64 (i32.const 0) (i32.const 0) (i32.const 0))))
`)

0 comments on commit 11388e7

Please sign in to comment.