* Tag sensible place (ECHECH) * Additional overflows checks.
This commit is contained in:
committed by
Afri Schoedon
parent
678138f097
commit
a6c4b17303
@@ -312,7 +312,7 @@ impl<'a> CallCreateExecutive<'a> {
|
||||
let prev_bal = state.balance(¶ms.address)?;
|
||||
if let ActionValue::Transfer(val) = params.value {
|
||||
state.sub_balance(¶ms.sender, &val, &mut substate.to_cleanup_mode(&schedule))?;
|
||||
state.new_contract(¶ms.address, val + prev_bal, nonce_offset)?;
|
||||
state.new_contract(¶ms.address, val.saturating_add(prev_bal), nonce_offset)?;
|
||||
} else {
|
||||
state.new_contract(¶ms.address, prev_bal, nonce_offset)?;
|
||||
}
|
||||
@@ -1103,9 +1103,13 @@ impl<'a, B: 'a + StateBackend> Executive<'a, B> {
|
||||
let refunded = cmp::min(refunds_bound, (t.gas - gas_left_prerefund) >> 1);
|
||||
let gas_left = gas_left_prerefund + refunded;
|
||||
|
||||
let gas_used = t.gas - gas_left;
|
||||
let refund_value = gas_left * t.gas_price;
|
||||
let fees_value = gas_used * t.gas_price;
|
||||
let gas_used = t.gas.saturating_sub(gas_left);
|
||||
let (refund_value, overflow_1) = gas_left.overflowing_mul(t.gas_price);
|
||||
let (fees_value, overflow_2) = gas_used.overflowing_mul(t.gas_price);
|
||||
if overflow_1 || overflow_2 {
|
||||
return Err(ExecutionError::TransactionMalformed("U256 Overflow".to_string()));
|
||||
}
|
||||
|
||||
|
||||
trace!("exec::finalize: t.gas={}, sstore_refunds={}, suicide_refunds={}, refunds_bound={}, gas_left_prerefund={}, refunded={}, gas_left={}, gas_used={}, refund_value={}, fees_value={}\n",
|
||||
t.gas, sstore_refunds, suicide_refunds, refunds_bound, gas_left_prerefund, refunded, gas_left, gas_used, refund_value, fees_value);
|
||||
@@ -1123,7 +1127,7 @@ impl<'a, B: 'a + StateBackend> Executive<'a, B> {
|
||||
}
|
||||
|
||||
// perform garbage-collection
|
||||
let min_balance = if schedule.kill_dust != CleanDustMode::Off { Some(U256::from(schedule.tx_gas) * t.gas_price) } else { None };
|
||||
let min_balance = if schedule.kill_dust != CleanDustMode::Off { Some(U256::from(schedule.tx_gas).overflowing_mul(t.gas_price).0) } else { None };
|
||||
self.state.kill_garbage(&substate.touched, schedule.kill_empty, &min_balance, schedule.kill_dust == CleanDustMode::WithCodeAndStorage)?;
|
||||
|
||||
match result {
|
||||
|
||||
@@ -466,12 +466,12 @@ impl Account {
|
||||
|
||||
/// Increment the nonce of the account by one.
|
||||
pub fn inc_nonce(&mut self) {
|
||||
self.nonce = self.nonce + U256::from(1u8);
|
||||
self.nonce = self.nonce.saturating_add(U256::from(1u8));
|
||||
}
|
||||
|
||||
/// Increase account balance.
|
||||
pub fn add_balance(&mut self, x: &U256) {
|
||||
self.balance = self.balance + *x;
|
||||
self.balance = self.balance.saturating_add(*x);
|
||||
}
|
||||
|
||||
/// Decrease account balance.
|
||||
|
||||
@@ -500,7 +500,12 @@ impl<B: Backend> State<B> {
|
||||
/// it will have its code reset, ready for `init_code()`.
|
||||
pub fn new_contract(&mut self, contract: &Address, balance: U256, nonce_offset: U256) -> TrieResult<()> {
|
||||
let original_storage_root = self.original_storage_root(contract)?;
|
||||
self.insert_cache(contract, AccountEntry::new_dirty(Some(Account::new_contract(balance, self.account_start_nonce + nonce_offset, original_storage_root))));
|
||||
let (nonce, overflow) = self.account_start_nonce.overflowing_add(nonce_offset);
|
||||
if overflow {
|
||||
return Err(Box::new(TrieError::DecoderError(H256::from(contract),
|
||||
rlp::DecoderError::Custom("Nonce overflow".into()))));
|
||||
}
|
||||
self.insert_cache(contract, AccountEntry::new_dirty(Some(Account::new_contract(balance, nonce, original_storage_root))));
|
||||
Ok(())
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user