@@ -19,8 +19,11 @@ fn read_memory<Q>(env: &Environment<Q>, ptr: i64, len: i64) -> Result<Vec<u8>, E
19
19
where
20
20
Q : Querier + ' static ,
21
21
{
22
+ if ptr < 0 {
23
+ return Err ( Error :: MemoryOutOfBoundError ) ;
24
+ }
22
25
let memory = env. memory ( ) ?;
23
- require_mem_range ( memory. size ( ) . bytes ( ) . 0 , ( ptr. saturating_add ( len) ) as usize ) ?;
26
+ require_mem_range ( memory. size ( ) . bytes ( ) . 0 , ( ptr as usize ) . saturating_add ( len as usize ) ) ?;
24
27
Ok ( memory. view ( ) [ ptr as usize ..( ptr. saturating_add ( len) ) as usize ]
25
28
. iter ( )
26
29
. map ( |cell| cell. get ( ) )
@@ -31,8 +34,11 @@ fn write_memory<Q>(env: &Environment<Q>, ptr: i64, data: Vec<u8>) -> Result<i64,
31
34
where
32
35
Q : Querier + ' static ,
33
36
{
37
+ if ptr < 0 {
38
+ return Err ( Error :: MemoryOutOfBoundError ) ;
39
+ }
34
40
let memory = env. memory ( ) ?;
35
- require_mem_range ( memory. size ( ) . bytes ( ) . 0 , ( ptr. saturating_add ( data. len ( ) as i64 ) ) as usize ) ?;
41
+ require_mem_range ( memory. size ( ) . bytes ( ) . 0 , ( ptr as usize ) . saturating_add ( data. len ( ) as usize ) ) ?;
36
42
for ( idx, byte) in data. iter ( ) . enumerate ( ) {
37
43
memory. view ( ) [ ( ptr as usize ) . saturating_add ( idx) ] . set ( * byte) ;
38
44
}
@@ -459,46 +465,104 @@ mod test {
459
465
460
466
#[ test]
461
467
fn test_do_gas ( ) {
462
- let gas_limit = 2_500_000_000_000 ;
468
+ let mut gas_limit = 2_500_000_000_000 ;
463
469
let ( owasm_env, instance) = create_owasm_env ( ) ;
464
470
let instance_ptr = NonNull :: from ( & instance) ;
465
471
owasm_env. set_wasmer_instance ( Some ( instance_ptr) ) ;
466
472
owasm_env. set_gas_left ( gas_limit) ;
467
473
468
474
assert_eq ! ( Ok ( ( ) ) , do_gas( & owasm_env, 0 ) ) ;
475
+ gas_limit = gas_limit - IMPORTED_FUNCTION_GAS ;
476
+ assert_eq ! ( gas_limit, owasm_env. get_gas_left( ) ) ;
477
+
478
+ assert_eq ! ( Ok ( ( ) ) , do_gas( & owasm_env, u32 :: MAX ) ) ;
479
+ gas_limit = gas_limit - IMPORTED_FUNCTION_GAS ;
480
+ assert_eq ! ( gas_limit, owasm_env. get_gas_left( ) ) ;
469
481
}
470
482
471
483
#[ test]
472
484
fn test_do_get_span_size ( ) {
473
- let gas_limit = 2_500_000_000_000 ;
485
+ let mut gas_limit = 2_500_000_000_000 ;
474
486
let ( owasm_env, instance) = create_owasm_env ( ) ;
475
487
let instance_ptr = NonNull :: from ( & instance) ;
476
488
owasm_env. set_wasmer_instance ( Some ( instance_ptr) ) ;
477
489
owasm_env. set_gas_left ( gas_limit) ;
478
490
479
491
assert_eq ! ( 300 , do_get_span_size( & owasm_env) . unwrap( ) ) ;
492
+ gas_limit = gas_limit - IMPORTED_FUNCTION_GAS ;
493
+ assert_eq ! ( gas_limit, owasm_env. get_gas_left( ) ) ;
480
494
}
481
495
482
496
#[ test]
483
497
fn test_do_read_calldata ( ) {
484
- let gas_limit = 2_500_000_000_000 ;
498
+ let mut gas_limit = 2_500_000_000_000 ;
485
499
let ( owasm_env, instance) = create_owasm_env ( ) ;
486
500
let instance_ptr = NonNull :: from ( & instance) ;
487
501
owasm_env. set_wasmer_instance ( Some ( instance_ptr) ) ;
488
502
owasm_env. set_gas_left ( gas_limit) ;
489
503
490
504
assert_eq ! ( 1 , do_read_calldata( & owasm_env, 0 ) . unwrap( ) ) ;
505
+ gas_limit = gas_limit
506
+ - IMPORTED_FUNCTION_GAS . saturating_add ( calculate_write_memory_gas ( vec ! [ 1 ] . len ( ) ) ) ;
507
+ assert_eq ! ( gas_limit, owasm_env. get_gas_left( ) ) ;
508
+
509
+ assert_eq ! ( Err ( Error :: MemoryOutOfBoundError ) , do_read_calldata( & owasm_env, -1 ) ) ;
510
+ gas_limit = gas_limit
511
+ - IMPORTED_FUNCTION_GAS . saturating_add ( calculate_write_memory_gas ( vec ! [ 1 ] . len ( ) ) ) ;
512
+ assert_eq ! ( gas_limit, owasm_env. get_gas_left( ) ) ;
513
+
514
+ assert_eq ! ( Err ( Error :: MemoryOutOfBoundError ) , do_read_calldata( & owasm_env, 6553600 ) ) ;
515
+ gas_limit = gas_limit
516
+ - IMPORTED_FUNCTION_GAS . saturating_add ( calculate_write_memory_gas ( vec ! [ 1 ] . len ( ) ) ) ;
517
+ assert_eq ! ( gas_limit, owasm_env. get_gas_left( ) ) ;
518
+
519
+ assert_eq ! ( Err ( Error :: MemoryOutOfBoundError ) , do_read_calldata( & owasm_env, i64 :: MAX ) ) ;
520
+ gas_limit = gas_limit
521
+ - IMPORTED_FUNCTION_GAS . saturating_add ( calculate_write_memory_gas ( vec ! [ 1 ] . len ( ) ) ) ;
522
+ assert_eq ! ( gas_limit, owasm_env. get_gas_left( ) ) ;
523
+
524
+ assert_eq ! ( Err ( Error :: MemoryOutOfBoundError ) , do_read_calldata( & owasm_env, i64 :: MIN ) ) ;
525
+ gas_limit = gas_limit
526
+ - IMPORTED_FUNCTION_GAS . saturating_add ( calculate_write_memory_gas ( vec ! [ 1 ] . len ( ) ) ) ;
527
+ assert_eq ! ( gas_limit, owasm_env. get_gas_left( ) ) ;
491
528
}
492
529
493
530
#[ test]
494
531
fn test_do_set_return_data ( ) {
495
- let gas_limit = 2_500_000_000_000 ;
532
+ let mut gas_limit = 2_500_000_000_000 ;
496
533
let ( owasm_env, instance) = create_owasm_env ( ) ;
497
534
let instance_ptr = NonNull :: from ( & instance) ;
498
535
owasm_env. set_wasmer_instance ( Some ( instance_ptr) ) ;
499
536
owasm_env. set_gas_left ( gas_limit) ;
500
537
501
- assert_eq ! ( Ok ( ( ) ) , do_set_return_data( & owasm_env, 0 , 0 ) )
538
+ assert_eq ! ( Ok ( ( ) ) , do_set_return_data( & owasm_env, 0 , 0 ) ) ;
539
+ gas_limit =
540
+ gas_limit - IMPORTED_FUNCTION_GAS . saturating_add ( calculate_read_memory_gas ( 0 as i64 ) ) ;
541
+ assert_eq ! ( gas_limit, owasm_env. get_gas_left( ) ) ;
542
+
543
+ assert_eq ! ( Err ( Error :: MemoryOutOfBoundError ) , do_set_return_data( & owasm_env, -1 , 0 ) ) ;
544
+ gas_limit =
545
+ gas_limit - IMPORTED_FUNCTION_GAS . saturating_add ( calculate_read_memory_gas ( 0 as i64 ) ) ;
546
+ assert_eq ! ( gas_limit, owasm_env. get_gas_left( ) ) ;
547
+
548
+ assert_eq ! ( Err ( Error :: MemoryOutOfBoundError ) , do_set_return_data( & owasm_env, i64 :: MAX , 0 ) ) ;
549
+ gas_limit =
550
+ gas_limit - IMPORTED_FUNCTION_GAS . saturating_add ( calculate_read_memory_gas ( 0 as i64 ) ) ;
551
+ assert_eq ! ( gas_limit, owasm_env. get_gas_left( ) ) ;
552
+
553
+ assert_eq ! ( Err ( Error :: MemoryOutOfBoundError ) , do_set_return_data( & owasm_env, i64 :: MIN , 0 ) ) ;
554
+ gas_limit =
555
+ gas_limit - IMPORTED_FUNCTION_GAS . saturating_add ( calculate_read_memory_gas ( 0 as i64 ) ) ;
556
+ assert_eq ! ( gas_limit, owasm_env. get_gas_left( ) ) ;
557
+
558
+ assert_eq ! ( Err ( Error :: DataLengthOutOfBound ) , do_set_return_data( & owasm_env, 0 , -1 ) ) ;
559
+ assert_eq ! ( gas_limit, owasm_env. get_gas_left( ) ) ;
560
+
561
+ assert_eq ! ( Err ( Error :: SpanTooSmallError ) , do_set_return_data( & owasm_env, 0 , i64 :: MAX ) ) ;
562
+ assert_eq ! ( gas_limit, owasm_env. get_gas_left( ) ) ;
563
+
564
+ assert_eq ! ( Err ( Error :: DataLengthOutOfBound ) , do_set_return_data( & owasm_env, 0 , i64 :: MIN ) ) ;
565
+ assert_eq ! ( gas_limit, owasm_env. get_gas_left( ) ) ;
502
566
}
503
567
504
568
#[ test]
0 commit comments