Skip to content

Commit

Permalink
Merge #995
Browse files Browse the repository at this point in the history
995: fix(runtime-core) Remove a panic when generating globals with a corrupted module r=syrusakbary a=Hywan

Fix #979.

When we try to get a global that doesn't exist, a panic is
generated. This patch skips such panic and let a proper error be
generated.

Before this patch:

```
$ cargo run -- run panic_index_oob_all_backends.wasm
Error: ExportNotFound { name: "main" }
```

With this patch:

```sh
$ cargo run -- run panic_index_oob_all_backends.wasm
Error: Can't instantiate module: LinkError([Generic { message: "Trying to read the `0` global that isn\'t properly initialized." }])
```

Co-authored-by: Ivan Enderlin <[email protected]>
  • Loading branch information
bors[bot] and Hywan authored Nov 21, 2019
2 parents 5e728ae + 7313672 commit d5f25aa
Show file tree
Hide file tree
Showing 2 changed files with 13 additions and 3 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

## **[Unreleased]**

- [#995](https://github.com/wasmerio/wasmer/pull/995) Detect when a global is read without being initialized (emit a proper error instead of panicking)
- [#992](https://github.com/wasmerio/wasmer/pull/992) Updates WAPM version to 0.4.1, fix arguments issue introduced in #990
- [#990](https://github.com/wasmerio/wasmer/pull/990) Default wasmer CLI to `run`. Wasmer will now attempt to parse unrecognized command line options as if they were applied to the run command: `wasmer mywasm.wasm --dir=.` now works!
- [#987](https://github.com/wasmerio/wasmer/pull/987) Fix `runtime-c-api` header files when compiled by gnuc.
Expand Down
15 changes: 12 additions & 3 deletions lib/runtime-core/src/backing.rs
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ impl LocalBacking {
}
};
let mut tables = Self::generate_tables(module);
let mut globals = Self::generate_globals(module, imports);
let mut globals = Self::generate_globals(module, imports)?;

// Ensure all initializers are valid before running finalizers
Self::validate_memories(module, imports)?;
Expand Down Expand Up @@ -443,13 +443,22 @@ impl LocalBacking {
fn generate_globals(
module: &ModuleInner,
imports: &ImportBacking,
) -> BoxedMap<LocalGlobalIndex, Global> {
) -> LinkResult<BoxedMap<LocalGlobalIndex, Global>> {
let mut globals = Map::with_capacity(module.info.globals.len());

for (_, global_init) in module.info.globals.iter() {
let value = match &global_init.init {
Initializer::Const(value) => value.clone(),
Initializer::GetGlobal(import_global_index) => {
if imports.globals.len() <= import_global_index.index() {
return Err(vec![LinkError::Generic {
message: format!(
"Trying to read the `{:?}` global that is not properly initialized.",
import_global_index.index()
),
}]);
}

imports.globals[*import_global_index].get()
}
};
Expand All @@ -463,7 +472,7 @@ impl LocalBacking {
globals.push(global);
}

globals.into_boxed_map()
Ok(globals.into_boxed_map())
}

fn finalize_globals(
Expand Down

0 comments on commit d5f25aa

Please sign in to comment.