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:
@@ -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());
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user