diff --git a/modules/evm-bridge/src/lib.rs b/modules/evm-bridge/src/lib.rs index 339785a48..4253549c6 100644 --- a/modules/evm-bridge/src/lib.rs +++ b/modules/evm-bridge/src/lib.rs @@ -368,16 +368,20 @@ impl Pallet { Error::::InvalidReturnValue ); - let offset = U256::from_big_endian(&output[0..32]); - let length = U256::from_big_endian(&output[offset.as_usize()..offset.as_usize() + 32]); + let offset = U256::from_big_endian(output.get(0..32).unwrap_or_default()); + let offset: usize = offset.try_into().map_err(|_| Error::::InvalidReturnValue)?; + let offset_end = offset.checked_add(32).ok_or(Error::::InvalidReturnValue)?; + let length = U256::from_big_endian(output.get(offset..offset_end).unwrap_or_default()); + let length: usize = length.try_into().map_err(|_| Error::::InvalidReturnValue)?; + let length_end = offset_end.checked_add(length).ok_or(Error::::InvalidReturnValue)?; ensure!( // output is 32-byte aligned. ensure total_length >= offset + string length + string data length. - output.len() >= offset.as_usize() + 32 + length.as_usize(), + output.len() >= length_end, Error::::InvalidReturnValue ); let mut data = Vec::new(); - data.extend_from_slice(&output[offset.as_usize() + 32..offset.as_usize() + 32 + length.as_usize()]); + data.extend_from_slice(output.get(offset_end..length_end).unwrap_or_default()); Ok(data.to_vec()) } diff --git a/modules/evm/src/precompiles/modexp.rs b/modules/evm/src/precompiles/modexp.rs index b1e7a29da..027b1c957 100644 --- a/modules/evm/src/precompiles/modexp.rs +++ b/modules/evm/src/precompiles/modexp.rs @@ -279,8 +279,12 @@ impl Precompile for IstanbulModexp { }); } let cost = ModexpPricer::cost(Self::DIVISOR, input); + let cost = TryInto::::try_into(cost).map_err(|_| PrecompileFailure::Error { + exit_status: ExitError::OutOfGas, + })?; + if let Some(target_gas) = target_gas { - if cost > U256::from(u64::MAX) || target_gas < cost.as_u64() { + if target_gas < cost { return Err(PrecompileFailure::Error { exit_status: ExitError::OutOfGas, }); @@ -288,7 +292,7 @@ impl Precompile for IstanbulModexp { } let output = Self::execute_modexp(input); - handle.record_cost(cost.as_u64())?; + handle.record_cost(cost)?; Ok(PrecompileOutput { exit_status: ExitSucceed::Returned, diff --git a/modules/evm/src/runner/stack.rs b/modules/evm/src/runner/stack.rs index 11566857a..8287e03ea 100644 --- a/modules/evm/src/runner/stack.rs +++ b/modules/evm/src/runner/stack.rs @@ -633,11 +633,11 @@ impl<'vicinity, 'config, T: Config> BackendT for SubstrateStackState<'vicinity, } fn block_hash(&self, number: U256) -> H256 { - if number > U256::from(u32::MAX) { - H256::default() - } else { - let number = BlockNumberFor::::from(number.as_u32()); + if let Ok(number) = TryInto::::try_into(number) { + let number = BlockNumberFor::::from(number); H256::from_slice(frame_system::Pallet::::block_hash(number).as_ref()) + } else { + H256::default() } } diff --git a/orml b/orml index 8c332b1f0..fbfced844 160000 --- a/orml +++ b/orml @@ -1 +1 @@ -Subproject commit 8c332b1f025558d198b90b3f4f3de14226fa1846 +Subproject commit fbfced844780f52520b0337bb9c80fb2a3508c54