Skip to content
This repository was archived by the owner on Nov 3, 2021. It is now read-only.

Commit 11388e7

Browse files
authored
Add test ensuring data segment index is unsigned (#136)
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.
1 parent 97dec20 commit 11388e7

File tree

5 files changed

+126
-0
lines changed

5 files changed

+126
-0
lines changed

test/core/bulk.wast

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,22 @@
176176
(assert_trap (invoke "init_active" (i32.const 1)) "out of bounds")
177177
(invoke "init_active" (i32.const 0))
178178

179+
;; Test that the data segment index is properly encoded as an unsigned (not
180+
;; signed) LEB.
181+
(module
182+
(memory 1)
183+
;; 65 data segments. 64 is the smallest positive number that is encoded
184+
;; differently as a signed LEB.
185+
(data "") (data "") (data "") (data "") (data "") (data "") (data "") (data "")
186+
(data "") (data "") (data "") (data "") (data "") (data "") (data "") (data "")
187+
(data "") (data "") (data "") (data "") (data "") (data "") (data "") (data "")
188+
(data "") (data "") (data "") (data "") (data "") (data "") (data "") (data "")
189+
(data "") (data "") (data "") (data "") (data "") (data "") (data "") (data "")
190+
(data "") (data "") (data "") (data "") (data "") (data "") (data "") (data "")
191+
(data "") (data "") (data "") (data "") (data "") (data "") (data "") (data "")
192+
(data "") (data "") (data "") (data "") (data "") (data "") (data "") (data "")
193+
(data "")
194+
(func (data.drop 64)))
179195

180196
;; table.init
181197
(module
@@ -251,6 +267,30 @@
251267
(assert_trap (invoke "init_active" (i32.const 1)) "out of bounds")
252268
(invoke "init_active" (i32.const 0))
253269

270+
;; Test that the elem segment index is properly encoded as an unsigned (not
271+
;; signed) LEB.
272+
(module
273+
(table 1 funcref)
274+
;; 65 elem segments. 64 is the smallest positive number that is encoded
275+
;; differently as a signed LEB.
276+
(elem funcref) (elem funcref) (elem funcref) (elem funcref)
277+
(elem funcref) (elem funcref) (elem funcref) (elem funcref)
278+
(elem funcref) (elem funcref) (elem funcref) (elem funcref)
279+
(elem funcref) (elem funcref) (elem funcref) (elem funcref)
280+
(elem funcref) (elem funcref) (elem funcref) (elem funcref)
281+
(elem funcref) (elem funcref) (elem funcref) (elem funcref)
282+
(elem funcref) (elem funcref) (elem funcref) (elem funcref)
283+
(elem funcref) (elem funcref) (elem funcref) (elem funcref)
284+
(elem funcref) (elem funcref) (elem funcref) (elem funcref)
285+
(elem funcref) (elem funcref) (elem funcref) (elem funcref)
286+
(elem funcref) (elem funcref) (elem funcref) (elem funcref)
287+
(elem funcref) (elem funcref) (elem funcref) (elem funcref)
288+
(elem funcref) (elem funcref) (elem funcref) (elem funcref)
289+
(elem funcref) (elem funcref) (elem funcref) (elem funcref)
290+
(elem funcref) (elem funcref) (elem funcref) (elem funcref)
291+
(elem funcref) (elem funcref) (elem funcref) (elem funcref)
292+
(elem funcref)
293+
(func (elem.drop 64)))
254294

255295
;; table.copy
256296
(module

test/core/memory_init.wast

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -949,3 +949,19 @@
949949

950950
(assert_return (invoke "checkRange" (i32.const 0) (i32.const 1) (i32.const 0))
951951
(i32.const -1))
952+
953+
(module
954+
(memory 1)
955+
;; 65 data segments. 64 is the smallest positive number that is encoded
956+
;; differently as a signed LEB.
957+
(data "") (data "") (data "") (data "") (data "") (data "") (data "") (data "")
958+
(data "") (data "") (data "") (data "") (data "") (data "") (data "") (data "")
959+
(data "") (data "") (data "") (data "") (data "") (data "") (data "") (data "")
960+
(data "") (data "") (data "") (data "") (data "") (data "") (data "") (data "")
961+
(data "") (data "") (data "") (data "") (data "") (data "") (data "") (data "")
962+
(data "") (data "") (data "") (data "") (data "") (data "") (data "") (data "")
963+
(data "") (data "") (data "") (data "") (data "") (data "") (data "") (data "")
964+
(data "") (data "") (data "") (data "") (data "") (data "") (data "") (data "")
965+
(data "")
966+
(func (memory.init 64 (i32.const 0) (i32.const 0) (i32.const 0))))
967+

test/core/table_init.wast

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1750,3 +1750,27 @@
17501750
(assert_trap (invoke "test" (i32.const 13)) "uninitialized element")
17511751
(assert_trap (invoke "test" (i32.const 14)) "uninitialized element")
17521752
(assert_trap (invoke "test" (i32.const 15)) "uninitialized element")
1753+
1754+
(module
1755+
(table 1 funcref)
1756+
;; 65 elem segments. 64 is the smallest positive number that is encoded
1757+
;; differently as a signed LEB.
1758+
(elem funcref) (elem funcref) (elem funcref) (elem funcref)
1759+
(elem funcref) (elem funcref) (elem funcref) (elem funcref)
1760+
(elem funcref) (elem funcref) (elem funcref) (elem funcref)
1761+
(elem funcref) (elem funcref) (elem funcref) (elem funcref)
1762+
(elem funcref) (elem funcref) (elem funcref) (elem funcref)
1763+
(elem funcref) (elem funcref) (elem funcref) (elem funcref)
1764+
(elem funcref) (elem funcref) (elem funcref) (elem funcref)
1765+
(elem funcref) (elem funcref) (elem funcref) (elem funcref)
1766+
(elem funcref) (elem funcref) (elem funcref) (elem funcref)
1767+
(elem funcref) (elem funcref) (elem funcref) (elem funcref)
1768+
(elem funcref) (elem funcref) (elem funcref) (elem funcref)
1769+
(elem funcref) (elem funcref) (elem funcref) (elem funcref)
1770+
(elem funcref) (elem funcref) (elem funcref) (elem funcref)
1771+
(elem funcref) (elem funcref) (elem funcref) (elem funcref)
1772+
(elem funcref) (elem funcref) (elem funcref) (elem funcref)
1773+
(elem funcref) (elem funcref) (elem funcref) (elem funcref)
1774+
(elem funcref)
1775+
(func (table.init 64 (i32.const 0) (i32.const 0) (i32.const 0))))
1776+

test/meta/generate_memory_init.js

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -292,3 +292,22 @@ mem_init(1, "", "", Math.floor(mem_init_len/2), 0xFFFFFF00);
292292
// We arithmetically overflow the segment limit but not the memory limit
293293
mem_init(1, "", "", PAGESIZE, 0xFFFFFFFC);
294294

295+
// Test that the data segment index is properly encoded as an unsigned (not
296+
// signed) LEB.
297+
print(
298+
`
299+
(module
300+
(memory 1)
301+
;; 65 data segments. 64 is the smallest positive number that is encoded
302+
;; differently as a signed LEB.
303+
(data "") (data "") (data "") (data "") (data "") (data "") (data "") (data "")
304+
(data "") (data "") (data "") (data "") (data "") (data "") (data "") (data "")
305+
(data "") (data "") (data "") (data "") (data "") (data "") (data "") (data "")
306+
(data "") (data "") (data "") (data "") (data "") (data "") (data "") (data "")
307+
(data "") (data "") (data "") (data "") (data "") (data "") (data "") (data "")
308+
(data "") (data "") (data "") (data "") (data "") (data "") (data "") (data "")
309+
(data "") (data "") (data "") (data "") (data "") (data "") (data "") (data "")
310+
(data "") (data "") (data "") (data "") (data "") (data "") (data "") (data "")
311+
(data "")
312+
(func (memory.init 64 (i32.const 0) (i32.const 0) (i32.const 0))))
313+
`)

test/meta/generate_table_init.js

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -336,3 +336,30 @@ tbl_init(tbl_init_len*4, tbl_init_len*4, tbl_init_len, 0xFFFFFFF0);
336336
// We arithmetically overflow the segment limit but not the table limit
337337
tbl_init(tbl_init_len, tbl_init_len, tbl_init_len, 0xFFFFFFFC, Math.floor(tbl_init_len/2));
338338

339+
// Test that the elem segment index is properly encoded as an unsigned (not
340+
// signed) LEB.
341+
print(
342+
`
343+
(module
344+
(table 1 funcref)
345+
;; 65 elem segments. 64 is the smallest positive number that is encoded
346+
;; differently as a signed LEB.
347+
(elem funcref) (elem funcref) (elem funcref) (elem funcref)
348+
(elem funcref) (elem funcref) (elem funcref) (elem funcref)
349+
(elem funcref) (elem funcref) (elem funcref) (elem funcref)
350+
(elem funcref) (elem funcref) (elem funcref) (elem funcref)
351+
(elem funcref) (elem funcref) (elem funcref) (elem funcref)
352+
(elem funcref) (elem funcref) (elem funcref) (elem funcref)
353+
(elem funcref) (elem funcref) (elem funcref) (elem funcref)
354+
(elem funcref) (elem funcref) (elem funcref) (elem funcref)
355+
(elem funcref) (elem funcref) (elem funcref) (elem funcref)
356+
(elem funcref) (elem funcref) (elem funcref) (elem funcref)
357+
(elem funcref) (elem funcref) (elem funcref) (elem funcref)
358+
(elem funcref) (elem funcref) (elem funcref) (elem funcref)
359+
(elem funcref) (elem funcref) (elem funcref) (elem funcref)
360+
(elem funcref) (elem funcref) (elem funcref) (elem funcref)
361+
(elem funcref) (elem funcref) (elem funcref) (elem funcref)
362+
(elem funcref) (elem funcref) (elem funcref) (elem funcref)
363+
(elem funcref)
364+
(func (table.init 64 (i32.const 0) (i32.const 0) (i32.const 0))))
365+
`)

0 commit comments

Comments
 (0)