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