1/* This file is part of DarkFi (https://dark.fi)
2 *
3 * Copyright (C) 2020-2025 Dyne.org foundation
4 *
5 * This program is free software: you can redistribute it and/or modify
6 * it under the terms of the GNU Affero General Public License as
7 * published by the Free Software Foundation, either version 3 of the
8 * License, or (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU Affero General Public License for more details.
14 *
15 * You should have received a copy of the GNU Affero General Public License
16 * along with this program. If not, see <https://www.gnu.org/licenses/>.
17 */
1819use wasmer::{MemoryView, WasmPtr};
2021use crate::Result;
2223pub trait MemoryManipulation {
24fn write_slice(&self, value_slice: &[u8], mem_offset: u32) -> Result<()>;
25}
2627impl MemoryManipulation for MemoryView<'_> {
28fn write_slice(&self, value_slice: &[u8], mem_offset: u32) -> Result<()> {
29// Prepare WasmPtr
30let ptr: WasmPtr<u8> = WasmPtr::new(mem_offset);
3132// Write to the slice
33let slice = ptr.slice(self, value_slice.len() as u32)?;
3435Ok(slice.write_slice(value_slice)?)
36 }
37}
3839#[cfg(test)]
40mod tests {
41use super::*;
42use std::io::Cursor;
4344use darkfi_serial::Decodable;
45use wasmer::{Memory, MemoryType, Store};
4647#[test]
48fn test_memoryview_writeslice() {
49let mut store = Store::default();
50let m = Memory::new(&mut store, MemoryType::new(1, None, false)).unwrap();
51let value: [u8; 3] = [3, 0, 1];
52let view = m.view(&store);
53let res = view.write_slice(&value, 0);
54assert!(res.is_ok());
55let ptr: WasmPtr<u8> = WasmPtr::new(0);
56let slice = ptr.slice(&view, value.len() as u32);
57let mut buf: [u8; 3] = [0; 3];
58let _ = slice.expect("err").read_slice(&mut buf);
59assert_eq!(buf, value);
60 }
6162#[test]
63fn test_memoryview_allread() -> Result<()> {
64let mut store = Store::default();
65let m = Memory::new(&mut store, MemoryType::new(1, None, false)).unwrap();
66let value: [u8; 3] = [3, 0, 1];
67let view = m.view(&store);
68let res = view.write_slice(&value, 0);
69assert!(res.is_ok());
70let ptr: WasmPtr<u8> = WasmPtr::new(0);
71let slice = ptr.slice(&view, value.len() as u32)?;
72let mut buf: [u8; 3] = [0; 3];
73let _ = slice.read_slice(&mut buf);
74let mut buf_reader = Cursor::new(buf);
75let ret: [u8; 3] = Decodable::decode(&mut buf_reader)?;
76assert!(buf.len() == (slice.len() as usize));
77assert_eq!(ret, value);
78assert!(buf_reader.position() == slice.len());
79Ok(())
80 }
81}