Faucet request limiter can overflow (bp #12691) (#12694)

* faucet: Add failing test case

(cherry picked from commit 5ae704d560)

* faucet: Use checked math in request limiter

(cherry picked from commit 87de82ac94)

Co-authored-by: Trent Nelson <trent@solana.com>
This commit is contained in:
mergify[bot]
2020-10-06 20:02:14 +00:00
committed by GitHub
parent add5c5b29f
commit f22a5efde5

View File

@ -87,7 +87,10 @@ impl Faucet {
}
pub fn check_time_request_limit(&mut self, request_amount: u64) -> bool {
(self.request_current + request_amount) <= self.per_time_cap
self.request_current
.checked_add(request_amount)
.map(|s| s <= self.per_time_cap)
.unwrap_or(false)
}
pub fn clear_request_count(&mut self) {
@ -122,7 +125,7 @@ impl Faucet {
}
}
if self.check_time_request_limit(lamports) {
self.request_current += lamports;
self.request_current = self.request_current.saturating_add(lamports);
datapoint_info!(
"faucet-airdrop",
("request_amount", lamports, i64),
@ -324,6 +327,8 @@ mod tests {
assert!(faucet.check_time_request_limit(1));
faucet.request_current = 3;
assert!(!faucet.check_time_request_limit(1));
faucet.request_current = 1;
assert!(!faucet.check_time_request_limit(u64::MAX));
}
#[test]