@@ -311,7 +311,7 @@ impl<'a> CallCreateExecutive<'a> {
311311 let prev_bal = state. balance ( & params. address ) ?;
312312 if let ActionValue :: Transfer ( val) = params. value {
313313 state. sub_balance ( & params. sender , & val, & mut substate. to_cleanup_mode ( & schedule) ) ?;
314- state. new_contract ( & params. address , val + prev_bal, nonce_offset) ?;
314+ state. new_contract ( & params. address , val. saturating_add ( prev_bal) , nonce_offset) ?;
315315 } else {
316316 state. new_contract ( & params. address , prev_bal, nonce_offset) ?;
317317 }
@@ -1102,9 +1102,13 @@ impl<'a, B: 'a + StateBackend> Executive<'a, B> {
11021102 let refunded = cmp:: min ( refunds_bound, ( t. gas - gas_left_prerefund) >> 1 ) ;
11031103 let gas_left = gas_left_prerefund + refunded;
11041104
1105- let gas_used = t. gas - gas_left;
1106- let refund_value = gas_left * t. gas_price ;
1107- let fees_value = gas_used * t. gas_price ;
1105+ let gas_used = t. gas . saturating_sub ( gas_left) ;
1106+ let ( refund_value, overflow_1) = gas_left. overflowing_mul ( t. gas_price ) ;
1107+ let ( fees_value, overflow_2) = gas_used. overflowing_mul ( t. gas_price ) ;
1108+ if overflow_1 || overflow_2 {
1109+ return Err ( ExecutionError :: TransactionMalformed ( "U256 Overflow" . to_string ( ) ) ) ;
1110+ }
1111+
11081112
11091113 trace ! ( "exec::finalize: t.gas={}, sstore_refunds={}, suicide_refunds={}, refunds_bound={}, gas_left_prerefund={}, refunded={}, gas_left={}, gas_used={}, refund_value={}, fees_value={}\n " ,
11101114 t. gas, sstore_refunds, suicide_refunds, refunds_bound, gas_left_prerefund, refunded, gas_left, gas_used, refund_value, fees_value) ;
@@ -1122,7 +1126,7 @@ impl<'a, B: 'a + StateBackend> Executive<'a, B> {
11221126 }
11231127
11241128 // perform garbage-collection
1125- let min_balance = if schedule. kill_dust != CleanDustMode :: Off { Some ( U256 :: from ( schedule. tx_gas ) * t. gas_price ) } else { None } ;
1129+ let min_balance = if schedule. kill_dust != CleanDustMode :: Off { Some ( U256 :: from ( schedule. tx_gas ) . overflowing_mul ( t. gas_price ) . 0 ) } else { None } ;
11261130 self . state . kill_garbage ( & substate. touched , schedule. kill_empty , & min_balance, schedule. kill_dust == CleanDustMode :: WithCodeAndStorage ) ?;
11271131
11281132 match result {
0 commit comments