Safe Memory read/write API (#2528)

This commit introduces two new methods on `Memory` that enable
reading and writing memory contents without requiring `unsafe`.

The methods return a new `MemoryError` if the memory access
fails.
This commit is contained in:
theduke
2021-01-26 16:09:20 +01:00
committed by GitHub
parent 79649a15f6
commit f4faa04dca
2 changed files with 103 additions and 2 deletions

View File

@@ -340,3 +340,40 @@ fn grow_externref_tables_via_api() -> anyhow::Result<()> {
Ok(())
}
#[test]
fn read_write_memory_via_api() {
let cfg = Config::new();
let store = Store::new(&Engine::new(&cfg));
let ty = MemoryType::new(Limits::new(1, None));
let mem = Memory::new(&store, ty);
mem.grow(1).unwrap();
let value = b"hello wasm";
mem.write(mem.data_size() - value.len(), value).unwrap();
let mut buffer = [0u8; 10];
mem.read(mem.data_size() - buffer.len(), &mut buffer)
.unwrap();
assert_eq!(value, &buffer);
// Error conditions.
// Out of bounds write.
let res = mem.write(mem.data_size() - value.len() + 1, value);
assert!(res.is_err());
// Out of bounds read.
let res = mem.read(mem.data_size() - buffer.len() + 1, &mut buffer);
assert!(res.is_err());
// Read offset overflow.
let res = mem.read(usize::MAX, &mut buffer);
assert!(res.is_err());
// Write offset overflow.
let res = mem.write(usize::MAX, &mut buffer);
assert!(res.is_err());
}