Skip to content

Commit

Permalink
Fix a panic with an invalid name section (#3509)
Browse files Browse the repository at this point in the history
This commit fixes a panic which can happen on a module with an invalid
name section where one of the functions named has the index `u32::MAX`.
Previously Wasmtime would create a new `FuncIndex` with the indices
found in the name section but the sentinel `u32::MAX` causes a panic.

Cranelift otherwise limits the number of functions through `wasmparser`
which has a hard limit (lower than `u32::MAX`) so this commit applies a
fix of only recording function names for function indices that are
actually present in the module.
  • Loading branch information
alexcrichton authored Nov 5, 2021
1 parent 6bcee7f commit 6be0f82
Show file tree
Hide file tree
Showing 2 changed files with 53 additions and 0 deletions.
10 changes: 10 additions & 0 deletions crates/environ/src/module_environ.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1277,6 +1277,11 @@ and for re-adding support for interface types you can see this issue:
let mut names = f.get_map()?;
for _ in 0..names.get_count() {
let Naming { index, name } = names.read()?;
// Skip this naming if it's naming a function that
// doesn't actually exist.
if (index as usize) >= self.result.module.functions.len() {
continue;
}
let index = FuncIndex::from_u32(index);
self.result
.module
Expand Down Expand Up @@ -1305,6 +1310,11 @@ and for re-adding support for interface types you can see this issue:
let mut reader = l.get_indirect_map()?;
for _ in 0..reader.get_indirect_count() {
let f = reader.read()?;
// Skip this naming if it's naming a function that
// doesn't actually exist.
if (f.indirect_index as usize) >= self.result.module.functions.len() {
continue;
}
let mut map = f.get_map()?;
for _ in 0..map.get_count() {
let Naming { index, name } = map.read()?;
Expand Down
43 changes: 43 additions & 0 deletions tests/misc_testsuite/empty.wast
Original file line number Diff line number Diff line change
@@ -1,3 +1,46 @@
(module (func (export "empty")))

(invoke "empty")

(module binary
"\00asm\01\00\00\00" ;; module header

"\00" ;; custom section id 0
"\0e" ;; section size
"\04name" ;; this is the `name` custom section
"\01" ;; function name subsection
"\07" ;; function name subsection size
"\01" ;; 1 function name mapping
"\ff\ff\ff\ff\0f" ;; index == u32::MAX
"\00" ;; empty string name
)

(module binary
"\00asm\01\00\00\00" ;; module header

"\00" ;; custom section id 0
"\10" ;; section size
"\04name" ;; this is the `name` custom section
"\02" ;; local name subsection
"\09" ;; local name subsection size
"\01" ;; 1 indirect name map
"\ff\ff\ff\ff\0f" ;; index == u32::MAX (function)
"\01" ;; 1 name mapping
"\00" ;; index == 0 (local)
"\00" ;; empty string name
)

(module binary
"\00asm\01\00\00\00" ;; module header

"\00" ;; custom section id 0
"\10" ;; section size
"\04name" ;; this is the `name` custom section
"\02" ;; local name subsection
"\09" ;; local name subsection size
"\01" ;; 1 indirect name map
"\00" ;; index == 0 (function)
"\01" ;; 1 name mapping
"\ff\ff\ff\ff\0f" ;; index == u32::MAX (local)
"\00" ;; empty string name
)

0 comments on commit 6be0f82

Please sign in to comment.