From bdf6a5660ebe3e9e22560956ffe48f8d54e2b7ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomasz=20Drwi=C4=99ga?= Date: Mon, 8 Aug 2016 09:59:00 +0200 Subject: [PATCH] Fixing gas conversion --- ethcore/src/evm/evm.rs | 22 ++++++++++++++++++++-- ethcore/src/evm/interpreter/mod.rs | 6 +++--- 2 files changed, 23 insertions(+), 5 deletions(-) diff --git a/ethcore/src/evm/evm.rs b/ethcore/src/evm/evm.rs index a40c03d1b..f19541d43 100644 --- a/ethcore/src/evm/evm.rs +++ b/ethcore/src/evm/evm.rs @@ -151,10 +151,14 @@ impl CostType for usize { } fn from_u256(val: U256) -> Result { - if U256::from(val.low_u64()) != val { + let res = val.low_u64() as usize; + + // validate if value fits into usize + if U256::from(res) != val { return Err(Error::OutOfGas); } - Ok(val.low_u64() as usize) + + Ok(res) } fn as_usize(&self) -> usize { @@ -191,6 +195,7 @@ pub trait Evm { #[test] +#[cfg(test)] fn should_calculate_overflow_mul_shr_without_overflow() { // given let num = 1048576; @@ -207,6 +212,7 @@ fn should_calculate_overflow_mul_shr_without_overflow() { } #[test] +#[cfg(test)] fn should_calculate_overflow_mul_shr_with_overflow() { // given let max = ::std::u64::MAX; @@ -225,3 +231,15 @@ fn should_calculate_overflow_mul_shr_with_overflow() { assert!(o1); } +#[test] +#[cfg(test)] +fn should_validate_u256_to_usize_conversion() { + // given + let v = U256::from(::std::usize::MAX) + U256::from(1); + + // when + let res = Gas::::from_u256(v); + + // then + assert!(res.is_err()); +} diff --git a/ethcore/src/evm/interpreter/mod.rs b/ethcore/src/evm/interpreter/mod.rs index 8a3eae5b3..07aa0060b 100644 --- a/ethcore/src/evm/interpreter/mod.rs +++ b/ethcore/src/evm/interpreter/mod.rs @@ -515,11 +515,11 @@ impl Interpreter { Ok(InstructionResult::Ok) } - fn copy_data_to_memory(&mut self, stack: &mut Stack, data: &[u8]) { + fn copy_data_to_memory(&mut self, stack: &mut Stack, source: &[u8]) { let dest_offset = stack.pop_back(); let source_offset = stack.pop_back(); let size = stack.pop_back(); - let source_size = U256::from(data.len()); + let source_size = U256::from(source.len()); let output_end = match source_offset > source_size || size > source_size || source_offset + size > source_size { true => { @@ -531,7 +531,7 @@ impl Interpreter { for i in zero_slice.iter_mut() { *i = 0; } - data.len() + source.len() }, false => (size.low_u64() + source_offset.low_u64()) as usize };