From 000bd98ae57c9adb387810570341c36e79f62d4b Mon Sep 17 00:00:00 2001 From: Alex Crichton Date: Thu, 10 Nov 2022 11:34:59 -0600 Subject: [PATCH] Merge pull request from GHSA-44mr-8vmm-wjhg Ensure that support is not regressed in keeping this working. --- tests/all/pooling_allocator.rs | 36 ++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/tests/all/pooling_allocator.rs b/tests/all/pooling_allocator.rs index 49485bf94b..b97ebd4747 100644 --- a/tests/all/pooling_allocator.rs +++ b/tests/all/pooling_allocator.rs @@ -778,3 +778,39 @@ fn dynamic_memory_pooling_allocator() -> Result<()> { Ok(()) } + +#[test] +fn zero_memory_pages_disallows_oob() -> Result<()> { + let mut pool = PoolingAllocationConfig::default(); + pool.instance_count(1).instance_memory_pages(0); + let mut config = Config::new(); + config.allocation_strategy(InstanceAllocationStrategy::Pooling(pool)); + + let engine = Engine::new(&config)?; + let module = Module::new( + &engine, + r#" + (module + (memory 0) + + (func (export "load") (param i32) (result i32) + local.get 0 + i32.load) + + (func (export "store") (param i32 ) + local.get 0 + local.get 0 + i32.store) + ) + "#, + )?; + let mut store = Store::new(&engine, ()); + let instance = Instance::new(&mut store, &module, &[])?; + let load32 = instance.get_typed_func::(&mut store, "load")?; + let store32 = instance.get_typed_func::(&mut store, "store")?; + for i in 0..31 { + assert!(load32.call(&mut store, 1 << i).is_err()); + assert!(store32.call(&mut store, 1 << i).is_err()); + } + Ok(()) +}