Fix incorrect use of MemoryIndex in the pooling allocator. (#3782)
This commit corrects a few places where `MemoryIndex` was used and treated like a `DefinedMemoryIndex` in the pooling instance allocator. When the unstable `multi-memory` proposal is enabled, it is possible to cause a newly allocated instance to use an incorrect base address for any defined memories by having the module being instantiated also import a memory. This requires enabling the unstable `multi-memory` proposal, configuring the use of the pooling instance allocator (not the default), and then configuring the module limits to allow imported memories (also not the default). The fix is to replace all uses of `MemoryIndex` with `DefinedMemoryIndex` in the pooling instance allocator. Several `debug_assert!` have also been updated to `assert!` to sanity check the state of the pooling allocator even in release builds.
This commit is contained in:
@@ -511,3 +511,40 @@ fn preserve_data_segments() -> Result<()> {
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn multi_memory_with_imported_memories() -> Result<()> {
|
||||
// This test checks that the base address for the defined memory is correct for the instance
|
||||
// despite the presence of an imported memory.
|
||||
|
||||
let mut config = Config::new();
|
||||
config.allocation_strategy(InstanceAllocationStrategy::Pooling {
|
||||
strategy: PoolingAllocationStrategy::NextAvailable,
|
||||
module_limits: ModuleLimits {
|
||||
memory_pages: 1,
|
||||
imported_memories: 1,
|
||||
memories: 1,
|
||||
..Default::default()
|
||||
},
|
||||
instance_limits: InstanceLimits { count: 1 },
|
||||
});
|
||||
config.wasm_multi_memory(true);
|
||||
|
||||
let engine = Engine::new(&config)?;
|
||||
let module = Module::new(
|
||||
&engine,
|
||||
r#"(module (import "" "m1" (memory 0)) (memory (export "m2") 1))"#,
|
||||
)?;
|
||||
|
||||
let mut store = Store::new(&engine, ());
|
||||
|
||||
let m1 = Memory::new(&mut store, MemoryType::new(0, None))?;
|
||||
let instance = Instance::new(&mut store, &module, &[m1.into()])?;
|
||||
|
||||
let m2 = instance.get_memory(&mut store, "m2").unwrap();
|
||||
|
||||
m2.data_mut(&mut store)[0] = 0x42;
|
||||
assert_eq!(m2.data(&store)[0], 0x42);
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user