Fix: decayed_counter can overflow if shifted more than 63 (#35054)

This commit is contained in:
Pankaj Garg 2024-02-02 10:10:43 -08:00 committed by GitHub
parent 4b528e890c
commit bf95f65ce1
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
1 changed files with 6 additions and 1 deletions

View File

@ -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
}
}
@ -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]