11#![ warn( clippy:: uninlined_format_args) ]
22
3+ use anyhow:: Context ;
34use clap:: parser:: ValueSource ;
45use clap:: Arg ;
56use clap:: ArgAction :: Set ;
67use core:: mem;
78use fs_err as fs;
8- use spacetimedb:: host:: wasmtime:: { Mem , MemView , WasmPointee as _} ;
99use spacetimedb_lib:: de:: serde:: DeserializeWrapper ;
1010use spacetimedb_lib:: { bsatn, RawModuleDefV8 } ;
1111use spacetimedb_lib:: { RawModuleDef , MODULE_ABI_MAJOR_VERSION } ;
@@ -298,13 +298,13 @@ fn extract_descriptions_from_module(module: wasmtime::Module) -> anyhow::Result<
298298 message_ptr : u32 ,
299299 message_len : u32 | {
300300 let ( mem, _) = WasmCtx :: mem_env ( & mut caller) ;
301- let slice = mem . deref_slice ( message_ptr, message_len) . unwrap ( ) ;
301+ let slice = deref_slice ( mem , message_ptr, message_len) . unwrap ( ) ;
302302 println ! ( "from wasm: {}" , String :: from_utf8_lossy( slice) ) ;
303303 } ,
304304 ) ?;
305305 linker. func_wrap ( module_name, "bytes_sink_write" , WasmCtx :: bytes_sink_write) ?;
306306 let instance = linker. instantiate ( & mut store, & module) ?;
307- let memory = Mem :: extract ( & instance , & mut store) ?;
307+ let memory = instance . get_memory ( & mut store, "memory" ) . context ( "no memory export" ) ?;
308308 store. data_mut ( ) . mem = Some ( memory) ;
309309
310310 let mut preinits = instance
@@ -329,19 +329,30 @@ fn extract_descriptions_from_module(module: wasmtime::Module) -> anyhow::Result<
329329}
330330
331331struct WasmCtx {
332- mem : Option < Mem > ,
332+ mem : Option < wasmtime :: Memory > ,
333333 sink : Vec < u8 > ,
334334}
335335
336+ fn deref_slice ( mem : & [ u8 ] , offset : u32 , len : u32 ) -> anyhow:: Result < & [ u8 ] > {
337+ anyhow:: ensure!( offset != 0 , "ptr is null" ) ;
338+ mem. get ( offset as usize ..)
339+ . and_then ( |s| s. get ( ..len as usize ) )
340+ . context ( "pointer out of bounds" )
341+ }
342+
343+ fn read_u32 ( mem : & [ u8 ] , offset : u32 ) -> anyhow:: Result < u32 > {
344+ Ok ( u32:: from_le_bytes ( deref_slice ( mem, offset, 4 ) ?. try_into ( ) . unwrap ( ) ) )
345+ }
346+
336347impl WasmCtx {
337- pub fn get_mem ( & self ) -> Mem {
348+ pub fn get_mem ( & self ) -> wasmtime :: Memory {
338349 self . mem . expect ( "Initialized memory" )
339350 }
340351
341- fn mem_env < ' a > ( ctx : impl Into < StoreContextMut < ' a , Self > > ) -> ( & ' a mut MemView , & ' a mut Self ) {
352+ fn mem_env < ' a > ( ctx : impl Into < StoreContextMut < ' a , Self > > ) -> ( & ' a mut [ u8 ] , & ' a mut Self ) {
342353 let ctx = ctx. into ( ) ;
343354 let mem = ctx. data ( ) . get_mem ( ) ;
344- mem. view_and_store_mut ( ctx)
355+ mem. data_and_store_mut ( ctx)
345356 }
346357
347358 pub fn bytes_sink_write (
@@ -357,9 +368,9 @@ impl WasmCtx {
357368 let ( mem, env) = Self :: mem_env ( & mut caller) ;
358369
359370 // Read `buffer_len`, i.e., the capacity of `buffer` pointed to by `buffer_ptr`.
360- let buffer_len = u32 :: read_from ( mem, buffer_len_ptr) ?;
371+ let buffer_len = read_u32 ( mem, buffer_len_ptr) ?;
361372 // Write `buffer` to `sink`.
362- let buffer = mem . deref_slice ( buffer_ptr, buffer_len) ?;
373+ let buffer = deref_slice ( mem , buffer_ptr, buffer_len) ?;
363374 env. sink . extend ( buffer) ;
364375
365376 Ok ( 0 )
0 commit comments