@@ -337,7 +337,7 @@ impl TableInstance {
337
337
}
338
338
}
339
339
340
- pub ( crate ) const PAGE_SIZE : usize = 64_000 ;
340
+ pub ( crate ) const PAGE_SIZE : usize = 65536 ;
341
341
pub ( crate ) const MAX_PAGES : usize = 65536 ;
342
342
pub ( crate ) const MAX_SIZE : usize = PAGE_SIZE * MAX_PAGES ;
343
343
@@ -366,35 +366,51 @@ impl MemoryInstance {
366
366
}
367
367
368
368
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
+ } ) ) ;
376
383
}
377
384
378
385
// 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) ;
380
387
Ok ( ( ) )
381
388
}
382
389
383
390
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,
388
402
len,
389
- self . data. len( )
390
- ) ) ) ;
403
+ max : self . data . len ( ) ,
404
+ } ) ) ;
391
405
}
392
406
393
407
// WebAssembly doesn't require alignment for loads
394
- Ok ( & self . data [ addr..addr + len ] )
408
+ Ok ( & self . data [ addr..end ] )
395
409
}
396
410
397
411
pub ( crate ) fn size ( & self ) -> i32 {
412
+ log:: debug!( "memory pages: {}" , self . page_count) ;
413
+ log:: debug!( "memory size: {}" , self . page_count * PAGE_SIZE ) ;
398
414
self . page_count as i32
399
415
}
400
416
0 commit comments