@@ -866,18 +866,17 @@ impl<'store> Executor<'store> {
866866 let value = T :: local_get ( & self . store . value_stack , & self . cf , u16:: from ( value_local) ) ;
867867 let mem_addr = self . mem_addr ( MemAddr :: from ( memarg. memory ( ) ) ) ;
868868 crate :: store:: with_memory!( self . store. state, mem_addr, |mem, kind| {
869- let addr = if kind. arch( ) == MemoryArch :: I64 {
869+ let base = if kind. arch( ) == MemoryArch :: I64 {
870870 let base = u64 :: local_get( & self . store. value_stack, & self . cf, u16 :: from( addr_local) ) ;
871- let base = cold_err!( usize :: try_from( base) . map_err( |_| Trap :: MemoryOutOfBounds {
871+ cold_err!( usize :: try_from( base) . map_err( |_| Trap :: MemoryOutOfBounds {
872872 offset: usize :: MAX ,
873873 len: N ,
874874 max: mem. len( ) ,
875- } ) ) ?;
876- cold_err!( mem. effective_addr:: <N >( base, u64 :: from( memarg. offset( ) ) ) ) ?
875+ } ) ) ?
877876 } else {
878- let base = u32 :: local_get( & self . store. value_stack, & self . cf, u16 :: from( addr_local) ) ;
879- cold_err!( mem. effective_addr:: <N >( base as usize , u64 :: from( memarg. offset( ) ) ) ) ?
877+ u32 :: local_get( & self . store. value_stack, & self . cf, u16 :: from( addr_local) ) as usize
880878 } ;
879+ let addr = cold_err!( mem. effective_addr:: <N >( base, u64 :: from( memarg. offset( ) ) ) ) ?;
881880 value. store_at( & mut * mem, addr)
882881 } )
883882 }
@@ -891,18 +890,17 @@ impl<'store> Executor<'store> {
891890 let memarg = index. resolve ( & self . func . data ) ;
892891 let mem_addr = self . mem_addr ( MemAddr :: from ( memarg. memory ( ) ) ) ;
893892 crate :: store:: with_memory!( self . store. state, mem_addr, |mem, kind| {
894- let addr = if kind. arch( ) == MemoryArch :: I64 {
893+ let base = if kind. arch( ) == MemoryArch :: I64 {
895894 let base = i64 :: local_get( & self . store. value_stack, & self . cf, u16 :: from( addr_local) ) as u64 ;
896- let base = cold_err!( usize :: try_from( base) . map_err( |_| Trap :: MemoryOutOfBounds {
895+ cold_err!( usize :: try_from( base) . map_err( |_| Trap :: MemoryOutOfBounds {
897896 offset: usize :: MAX ,
898897 len: N ,
899898 max: mem. len( ) ,
900- } ) ) ?;
901- cold_err!( mem. effective_addr:: <N >( base, u64 :: from( memarg. offset( ) ) ) ) ?
899+ } ) ) ?
902900 } else {
903- let base = u32 :: local_get( & self . store. value_stack, & self . cf, u16 :: from( addr_local) ) ;
904- cold_err!( mem. effective_addr:: <N >( base as usize , u64 :: from( memarg. offset( ) ) ) ) ?
901+ u32 :: local_get( & self . store. value_stack, & self . cf, u16 :: from( addr_local) ) as usize
905902 } ;
903+ let addr = cold_err!( mem. effective_addr:: <N >( base, u64 :: from( memarg. offset( ) ) ) ) ?;
906904
907905 let value = cold_err!( T :: load_at( & * mem, addr) ) ?;
908906 increment( value) . store_at( & mut * mem, addr)
@@ -1343,28 +1341,19 @@ impl<'store> Executor<'store> {
13431341 let dst = self . store . value_stack . pop_memory_operand ( arch) ?;
13441342
13451343 let data = self . store . state . data [ self . module . resolve_data_addr ( data_index) as usize ] . data . clone ( ) ;
1344+ // Dropped segments behave like empty segments, including valid zero-length copies.
1345+ let data = data. as_deref ( ) . unwrap_or_default ( ) ;
1346+ let end = offset. checked_add ( size) . filter ( |& end| end <= data. len ( ) ) . ok_or ( Trap :: MemoryOutOfBounds {
1347+ offset,
1348+ len : size,
1349+ max : data. len ( ) ,
1350+ } ) ?;
13461351 crate :: store:: with_memory!( self . store. state, mem_addr, |mem, kind| {
1347- let data_len = data. as_ref( ) . map_or( 0 , |d| d. len( ) ) ;
1348- let mem_len = mem. len( ) ;
1349- if offset. checked_add( size) . is_none_or( |end| end > data_len) {
1350- return cold!( Err ( Trap :: MemoryOutOfBounds { offset, len: size, max: data_len } ) ) ;
1351- }
1352- if dst. checked_add( size) . is_none_or( |end| end > mem_len) {
1353- return cold!( Err ( Trap :: MemoryOutOfBounds { offset: dst, len: size, max: mem_len } ) ) ;
1354- }
1355-
1356- if size == 0 {
1357- return Ok ( ( ) ) ;
1358- }
1359-
1360- let Some ( data) = & data else {
1361- return cold!( Err ( Trap :: MemoryOutOfBounds { offset: 0 , len: 0 , max: 0 } ) ) ;
1362- } ;
1363-
1364- if mem. write_all( dst, & data[ offset..offset + size] ) . is_none( ) {
1365- return cold!( Err ( Trap :: MemoryOutOfBounds { offset: dst, len: size, max: mem_len } ) ) ;
1366- }
1367- Ok ( ( ) )
1352+ cold_err!( mem. write_all( dst, & data[ offset..end] ) . ok_or_else( || Trap :: MemoryOutOfBounds {
1353+ offset: dst,
1354+ len: size,
1355+ max: mem. len( ) ,
1356+ } ) )
13681357 } )
13691358 }
13701359
@@ -1531,10 +1520,9 @@ impl<'store> Executor<'store> {
15311520 }
15321521
15331522 match arg. is_64( ) {
1534- true => u64 :: stack_push( & mut self . store. value_stack, old) ? ,
1535- false => u32 :: stack_push( & mut self . store. value_stack, old as u32 ) ? ,
1523+ true => u64 :: stack_push( & mut self . store. value_stack, old) ,
1524+ false => u32 :: stack_push( & mut self . store. value_stack, old as u32 ) ,
15361525 }
1537- Ok ( ( ) )
15381526 } )
15391527 }
15401528
@@ -1550,8 +1538,7 @@ impl<'store> Executor<'store> {
15501538 crate :: store:: with_memory!( self . store. state, mem_addr, |mem, kind| {
15511539 let base = self . store. value_stack. pop_memory_operand( kind. arch( ) ) ?;
15521540 let addr = cold_err!( mem. effective_addr:: <N >( base, m. offset( ) ) ) ?;
1553- cold_err!( val. store_at( & mut * mem, addr) ) ?;
1554- Ok ( ( ) )
1541+ cold_err!( val. store_at( & mut * mem, addr) )
15551542 } )
15561543 }
15571544
0 commit comments