@@ -337,7 +337,7 @@ impl TableInstance {
337337 }
338338}
339339
340- pub ( crate ) const PAGE_SIZE : usize = 64_000 ;
340+ pub ( crate ) const PAGE_SIZE : usize = 65536 ;
341341pub ( crate ) const MAX_PAGES : usize = 65536 ;
342342pub ( crate ) const MAX_SIZE : usize = PAGE_SIZE * MAX_PAGES ;
343343
@@ -366,35 +366,51 @@ impl MemoryInstance {
366366 }
367367
368368 pub ( crate ) fn store ( & mut self , addr : usize , _align : usize , data : & [ u8 ] ) -> Result < ( ) > {
369- if addr + data. len ( ) > self . data . len ( ) {
370- return Err ( Error :: Other ( format ! (
371- "memory store out of bounds: offset={}, len={}, mem_size={}" ,
372- addr,
373- data. len( ) ,
374- self . data. len( )
375- ) ) ) ;
369+ let end = addr. checked_add ( data. len ( ) ) . ok_or_else ( || {
370+ Error :: Trap ( crate :: Trap :: MemoryOutOfBounds {
371+ offset : addr,
372+ len : data. len ( ) ,
373+ max : self . data . len ( ) ,
374+ } )
375+ } ) ?;
376+
377+ if end > self . data . len ( ) || end < addr {
378+ return Err ( Error :: Trap ( crate :: Trap :: MemoryOutOfBounds {
379+ offset : addr,
380+ len : data. len ( ) ,
381+ max : self . data . len ( ) ,
382+ } ) ) ;
376383 }
377384
378385 // WebAssembly doesn't require alignment for stores
379- self . data [ addr..addr + data . len ( ) ] . copy_from_slice ( data) ;
386+ self . data [ addr..end ] . copy_from_slice ( data) ;
380387 Ok ( ( ) )
381388 }
382389
383390 pub ( crate ) fn load ( & self , addr : usize , _align : usize , len : usize ) -> Result < & [ u8 ] > {
384- if addr + len > self . data . len ( ) {
385- return Err ( Error :: Other ( format ! (
386- "memory load out of bounds: offset={}, len={}, mem_size={}" ,
387- addr,
391+ let end = addr. checked_add ( len) . ok_or_else ( || {
392+ Error :: Trap ( crate :: Trap :: MemoryOutOfBounds {
393+ offset : addr,
394+ len,
395+ max : self . data . len ( ) ,
396+ } )
397+ } ) ?;
398+
399+ if end > self . data . len ( ) {
400+ return Err ( Error :: Trap ( crate :: Trap :: MemoryOutOfBounds {
401+ offset : addr,
388402 len,
389- self . data. len( )
390- ) ) ) ;
403+ max : self . data . len ( ) ,
404+ } ) ) ;
391405 }
392406
393407 // WebAssembly doesn't require alignment for loads
394- Ok ( & self . data [ addr..addr + len ] )
408+ Ok ( & self . data [ addr..end ] )
395409 }
396410
397411 pub ( crate ) fn size ( & self ) -> i32 {
412+ log:: debug!( "memory pages: {}" , self . page_count) ;
413+ log:: debug!( "memory size: {}" , self . page_count * PAGE_SIZE ) ;
398414 self . page_count as i32
399415 }
400416
0 commit comments