Skip to content

Commit b8a3e20

Browse files
authored
Fix error message for out-of-bounds variant discriminants (#12885)
Fixes a minor mistake when loading a `Val` from memory with an out-of-bounds discriminant.
1 parent 37c4942 commit b8a3e20

2 files changed

Lines changed: 27 additions & 7 deletions

File tree

crates/wasmtime/src/runtime/component/values.rs

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1045,13 +1045,10 @@ fn load_variant(
10451045
u32::linear_lift_from_memory(cx, InterfaceType::U32, &bytes[..4])?
10461046
}
10471047
};
1048-
let case_ty = types.nth(discriminant as usize).ok_or_else(|| {
1049-
format_err!(
1050-
"discriminant {} out of range [0..{})",
1051-
discriminant,
1052-
types.len()
1053-
)
1054-
})?;
1048+
let len = types.len();
1049+
let case_ty = types
1050+
.nth(discriminant as usize)
1051+
.ok_or_else(|| format_err!("discriminant {discriminant} out of range [0..{len})"))?;
10551052
let value = match case_ty {
10561053
Some(case_ty) => {
10571054
let payload_offset = usize::try_from(info.payload_offset32).unwrap();

tests/misc_testsuite/component-model/types.wast

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -353,3 +353,26 @@
353353
(export "t" (instance $t (type $t')))
354354
))
355355
)
356+
357+
(component definition $A
358+
(type $t' (variant (case "a" u32) (case "b")))
359+
(export $t "t" (type $t'))
360+
361+
(core module $m
362+
(memory (export "m") 1)
363+
(func (export "f") (param i32) (result i32)
364+
(i32.store8
365+
(i32.const 0)
366+
(local.get 0))
367+
i32.const 0)
368+
)
369+
(core instance $m (instantiate $m))
370+
(func (export "f") (param "a" u32) (result $t)
371+
(canon lift (core func $m "f") (memory $m "m"))
372+
)
373+
)
374+
375+
(component instance $A $A)
376+
(assert_return (invoke "f" (u32.const 0)) (variant.const "a" (u32.const 0)))
377+
(assert_return (invoke "f" (u32.const 1)) (variant.const "b"))
378+
(assert_trap (invoke "f" (u32.const 2)) "discriminant 2 out of range [0..2)")

0 commit comments

Comments
 (0)