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