Fixing gas conversion

This commit is contained in:
Tomasz Drwięga 2016-08-08 09:59:00 +02:00
parent 4f32a9ccc1
commit bdf6a5660e
2 changed files with 23 additions and 5 deletions

View File

@ -151,10 +151,14 @@ impl CostType for usize {
} }
fn from_u256(val: U256) -> Result<Self> { fn from_u256(val: U256) -> Result<Self> {
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); return Err(Error::OutOfGas);
} }
Ok(val.low_u64() as usize)
Ok(res)
} }
fn as_usize(&self) -> usize { fn as_usize(&self) -> usize {
@ -191,6 +195,7 @@ pub trait Evm {
#[test] #[test]
#[cfg(test)]
fn should_calculate_overflow_mul_shr_without_overflow() { fn should_calculate_overflow_mul_shr_without_overflow() {
// given // given
let num = 1048576; let num = 1048576;
@ -207,6 +212,7 @@ fn should_calculate_overflow_mul_shr_without_overflow() {
} }
#[test] #[test]
#[cfg(test)]
fn should_calculate_overflow_mul_shr_with_overflow() { fn should_calculate_overflow_mul_shr_with_overflow() {
// given // given
let max = ::std::u64::MAX; let max = ::std::u64::MAX;
@ -225,3 +231,15 @@ fn should_calculate_overflow_mul_shr_with_overflow() {
assert!(o1); 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::<usize>::from_u256(v);
// then
assert!(res.is_err());
}

View File

@ -515,11 +515,11 @@ impl<Cost: CostType> Interpreter<Cost> {
Ok(InstructionResult::Ok) Ok(InstructionResult::Ok)
} }
fn copy_data_to_memory(&mut self, stack: &mut Stack<U256>, data: &[u8]) { fn copy_data_to_memory(&mut self, stack: &mut Stack<U256>, source: &[u8]) {
let dest_offset = stack.pop_back(); let dest_offset = stack.pop_back();
let source_offset = stack.pop_back(); let source_offset = stack.pop_back();
let size = 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 { let output_end = match source_offset > source_size || size > source_size || source_offset + size > source_size {
true => { true => {
@ -531,7 +531,7 @@ impl<Cost: CostType> Interpreter<Cost> {
for i in zero_slice.iter_mut() { for i in zero_slice.iter_mut() {
*i = 0; *i = 0;
} }
data.len() source.len()
}, },
false => (size.low_u64() + source_offset.low_u64()) as usize false => (size.low_u64() + source_offset.low_u64()) as usize
}; };