()
| 1109 | #[test] |
| 1110 | #[cfg_attr(miri, ignore)] |
| 1111 | fn growth_trap() -> Result<()> { |
| 1112 | let engine = Engine::default(); |
| 1113 | let module = Module::new( |
| 1114 | &engine, |
| 1115 | r#"(module |
| 1116 | (memory $m (export "m") 0) |
| 1117 | (table (export "t") 0 funcref) |
| 1118 | (func (export "grow") (param i32) (result i32) |
| 1119 | (memory.grow $m (local.get 0))) |
| 1120 | )"#, |
| 1121 | )?; |
| 1122 | |
| 1123 | let mut store = Store::new( |
| 1124 | &engine, |
| 1125 | StoreLimitsBuilder::new() |
| 1126 | .memory_size(WASM_PAGE_SIZE) |
| 1127 | .table_elements(1) |
| 1128 | .trap_on_grow_failure(true) |
| 1129 | .build(), |
| 1130 | ); |
| 1131 | store.limiter(|s| s as &mut dyn ResourceLimiter); |
| 1132 | |
| 1133 | let instance = Instance::new(&mut store, &module, &[])?; |
| 1134 | |
| 1135 | // Test instance exports and host objects hitting the limit |
| 1136 | for memory in [ |
| 1137 | instance.get_memory(&mut store, "m").unwrap(), |
| 1138 | Memory::new(&mut store, MemoryType::new(0, None))?, |
| 1139 | ] { |
| 1140 | memory.grow(&mut store, 1)?; |
| 1141 | assert!(memory.grow(&mut store, 1).is_err()); |
| 1142 | } |
| 1143 | |
| 1144 | // Test instance exports and host objects hitting the limit |
| 1145 | for table in [ |
| 1146 | instance.get_table(&mut store, "t").unwrap(), |
| 1147 | Table::new( |
| 1148 | &mut store, |
| 1149 | TableType::new(RefType::FUNCREF, 0, None), |
| 1150 | Ref::Func(None), |
| 1151 | )?, |
| 1152 | ] { |
| 1153 | table.grow(&mut store, 1, Ref::Func(None))?; |
| 1154 | assert!(table.grow(&mut store, 1, Ref::Func(None)).is_err()); |
| 1155 | } |
| 1156 | |
| 1157 | let mut store = Store::new(&engine, store.data().clone()); |
| 1158 | store.limiter(|s| s as &mut dyn ResourceLimiter); |
| 1159 | let instance = Instance::new(&mut store, &module, &[])?; |
| 1160 | let grow = instance.get_func(&mut store, "grow").unwrap(); |
| 1161 | let grow = grow.typed::<i32, i32>(&store).unwrap(); |
| 1162 | grow.call(&mut store, 1)?; |
| 1163 | assert!(grow.call(&mut store, 1).is_err()); |
| 1164 | |
| 1165 | Ok(()) |
| 1166 | } |
nothing calls this directly
no test coverage detected