809: Fix issue 800 - check index before accessing imports.globals r=syrusakbary a=pventuzelo

# Description

Fix issue #800 

* Check if `import_global_index` is valid i.e inside imports.globals range. 
* Related functions: 
  * validate_memories
  * validate_tables
  * finalize_memories
  * finalize_tables

# After the fix

``` sh
$ ./target/release/wasmer run index_oob_LocalBacking_validate_memories_152.wasm
execute_wasm: "Can\'t instantiate module: LinkError([Generic { message: \"incorrect global index for initializer\" }])"
--------------------------------------------------------------------------------------------------------
$ ./target/release/wasmer run index_oob_LocalBacking_validate_tables_276.wasm 
execute_wasm: "Can\'t instantiate module: LinkError([Generic { message: \"incorrect global index for initializer\" }])"
```

# Review

- [x] Create a short description of the the change in the CHANGELOG.md file


Co-authored-by: Patrick Ventuzelo <ventuzelo.patrick@gmail.com>
Co-authored-by: Patrick Ventuzelo <9038181+pventuzelo@users.noreply.github.com>
This commit is contained in:
bors[bot] 2019-09-25 09:50:51 +00:00 committed by GitHub
commit 231b1c20bf
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 21 additions and 0 deletions

View File

@ -6,6 +6,7 @@ Blocks of changes will separated by version increments.
## **[Unreleased]**
- [#809](https://github.com/wasmerio/wasmer/pull/809) Fix bugs leading to panics in `LocalBacking`.
- [#822](https://github.com/wasmerio/wasmer/pull/822) Update Cranelift fork version to `0.43.1`
- [#829](https://github.com/wasmerio/wasmer/pull/829) Fix deps on `make bench-*` commands; benchmarks don't compile other backends now
- [#807](https://github.com/wasmerio/wasmer/pull/807) Implement Send for `Instance`, breaking change on `ImportObject`, remove method `get_namespace` replaced with `with_namespace` and `maybe_with_namespace`

View File

@ -152,6 +152,11 @@ impl LocalBacking {
}]);
}
Initializer::GetGlobal(import_global_index) => {
if import_global_index.index() >= imports.globals.len() {
return Err(vec![LinkError::Generic {
message: "incorrect global index for initializer".to_string(),
}]);
}
if let Value::I32(x) = imports.globals[import_global_index].get() {
x as u32
} else {
@ -208,6 +213,11 @@ impl LocalBacking {
}]);
}
Initializer::GetGlobal(import_global_index) => {
if import_global_index.index() >= imports.globals.len() {
return Err(vec![LinkError::Generic {
message: "incorrect global index for initializer".to_string(),
}]);
}
if let Value::I32(x) = imports.globals[import_global_index].get() {
x as u32
} else {
@ -276,6 +286,11 @@ impl LocalBacking {
}]);
}
Initializer::GetGlobal(import_global_index) => {
if import_global_index.index() >= imports.globals.len() {
return Err(vec![LinkError::Generic {
message: "incorrect global index for initializer".to_string(),
}]);
}
if let Value::I32(x) = imports.globals[import_global_index].get() {
x as u32
} else {
@ -329,6 +344,11 @@ impl LocalBacking {
}]);
}
Initializer::GetGlobal(import_global_index) => {
if import_global_index.index() >= imports.globals.len() {
return Err(vec![LinkError::Generic {
message: "incorrect global index for initializer".to_string(),
}]);
}
if let Value::I32(x) = imports.globals[import_global_index].get() {
x as u32
} else {