Skip to content

Commit e551f25

Browse files
committed
check ptr > 0 and add more testcase
1 parent 655625a commit e551f25

File tree

1 file changed

+71
-7
lines changed

1 file changed

+71
-7
lines changed

packages/vm/src/imports.rs

Lines changed: 71 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,11 @@ fn read_memory<Q>(env: &Environment<Q>, ptr: i64, len: i64) -> Result<Vec<u8>, E
1919
where
2020
Q: Querier + 'static,
2121
{
22+
if ptr < 0 {
23+
return Err(Error::MemoryOutOfBoundError);
24+
}
2225
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))?;
2427
Ok(memory.view()[ptr as usize..(ptr.saturating_add(len)) as usize]
2528
.iter()
2629
.map(|cell| cell.get())
@@ -31,8 +34,11 @@ fn write_memory<Q>(env: &Environment<Q>, ptr: i64, data: Vec<u8>) -> Result<i64,
3134
where
3235
Q: Querier + 'static,
3336
{
37+
if ptr < 0 {
38+
return Err(Error::MemoryOutOfBoundError);
39+
}
3440
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))?;
3642
for (idx, byte) in data.iter().enumerate() {
3743
memory.view()[(ptr as usize).saturating_add(idx)].set(*byte);
3844
}
@@ -459,46 +465,104 @@ mod test {
459465

460466
#[test]
461467
fn test_do_gas() {
462-
let gas_limit = 2_500_000_000_000;
468+
let mut gas_limit = 2_500_000_000_000;
463469
let (owasm_env, instance) = create_owasm_env();
464470
let instance_ptr = NonNull::from(&instance);
465471
owasm_env.set_wasmer_instance(Some(instance_ptr));
466472
owasm_env.set_gas_left(gas_limit);
467473

468474
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());
469481
}
470482

471483
#[test]
472484
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;
474486
let (owasm_env, instance) = create_owasm_env();
475487
let instance_ptr = NonNull::from(&instance);
476488
owasm_env.set_wasmer_instance(Some(instance_ptr));
477489
owasm_env.set_gas_left(gas_limit);
478490

479491
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());
480494
}
481495

482496
#[test]
483497
fn test_do_read_calldata() {
484-
let gas_limit = 2_500_000_000_000;
498+
let mut gas_limit = 2_500_000_000_000;
485499
let (owasm_env, instance) = create_owasm_env();
486500
let instance_ptr = NonNull::from(&instance);
487501
owasm_env.set_wasmer_instance(Some(instance_ptr));
488502
owasm_env.set_gas_left(gas_limit);
489503

490504
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());
491528
}
492529

493530
#[test]
494531
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;
496533
let (owasm_env, instance) = create_owasm_env();
497534
let instance_ptr = NonNull::from(&instance);
498535
owasm_env.set_wasmer_instance(Some(instance_ptr));
499536
owasm_env.set_gas_left(gas_limit);
500537

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());
502566
}
503567

504568
#[test]

0 commit comments

Comments
 (0)