Skip to content

Commit

Permalink
Fix: decayed_counter can overflow if shifted more than 63 (solana-lab…
Browse files Browse the repository at this point in the history
  • Loading branch information
pgarg66 authored Feb 2, 2024
1 parent 4b528e8 commit bf95f65
Showing 1 changed file with 6 additions and 1 deletion.
7 changes: 6 additions & 1 deletion program-runtime/src/loaded_programs.rs
Original file line number Diff line number Diff line change
Expand Up @@ -464,7 +464,8 @@ impl LoadedProgram {

pub fn decayed_usage_counter(&self, now: Slot) -> u64 {
let last_access = self.latest_access_slot.load(Ordering::Relaxed);
let decaying_for = now.saturating_sub(last_access);
// Shifting the u64 value for more than 63 will cause an overflow.
let decaying_for = std::cmp::min(63, now.saturating_sub(last_access));
self.tx_usage_counter.load(Ordering::Relaxed) >> decaying_for
}
}
Expand Down Expand Up @@ -1359,6 +1360,10 @@ mod tests {
assert_eq!(program.decayed_usage_counter(19), 16);
assert_eq!(program.decayed_usage_counter(20), 8);
assert_eq!(program.decayed_usage_counter(21), 4);

// Decay for 63 or more slots
assert_eq!(program.decayed_usage_counter(18 + 63), 0);
assert_eq!(program.decayed_usage_counter(100), 0);
}

#[test]
Expand Down

0 comments on commit bf95f65

Please sign in to comment.