From 8213b1db0264977830419fc6d9a3c0a32463ffd2 Mon Sep 17 00:00:00 2001 From: sakridge Date: Fri, 12 Feb 2021 17:16:27 -0800 Subject: [PATCH] Stake program update (#15309) --- programs/stake/src/stake_state.rs | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/programs/stake/src/stake_state.rs b/programs/stake/src/stake_state.rs index 9a0f15e8f3..4776137ee0 100644 --- a/programs/stake/src/stake_state.rs +++ b/programs/stake/src/stake_state.rs @@ -52,6 +52,13 @@ impl Default for StakeState { } } +fn checked_add(a: u64, b: u64) -> Result { + match a.checked_add(b) { + Some(sum) => Ok(sum), + None => Err(InstructionError::InsufficientFunds), + } +} + impl StakeState { pub fn get_rent_exempt_reserve(rent: &Rent) -> u64 { rent.minimum_balance(std::mem::size_of::()) @@ -1144,7 +1151,8 @@ impl<'a> StakeAccount for KeyedAccount<'a> { stake.delegation.stake }; - (meta.lockup, staked + meta.rent_exempt_reserve, staked != 0) + let staked_and_reserve = checked_add(staked, meta.rent_exempt_reserve)?; + (meta.lockup, staked_and_reserve, staked != 0) } StakeState::Initialized(meta) => { meta.authorized @@ -1168,15 +1176,16 @@ impl<'a> StakeAccount for KeyedAccount<'a> { return Err(StakeError::LockupInForce.into()); } + let lamports_and_reserve = checked_add(lamports, reserve)?; // if the stake is active, we mustn't allow the account to go away if is_staked // line coverage for branch coverage - && lamports + reserve > self.lamports()? + && lamports_and_reserve > self.lamports()? { return Err(InstructionError::InsufficientFunds); } if lamports != self.lamports()? // not a full withdrawal - && lamports + reserve > self.lamports()? + && lamports_and_reserve > self.lamports()? { assert!(!is_staked); return Err(InstructionError::InsufficientFunds);