sanitizes bloom filters to avoid division by zero (#13714) (#13718)

Pull requests received over the wire can cause a validator to panic
because of division by zero in bloom filters:
https://github.com/solana-labs/solana/blob/af08ba93e/runtime/src/bloom.rs#L86-L88

(cherry picked from commit a8c29505f0)

Co-authored-by: behzad nouri <behzadnouri@gmail.com>
This commit is contained in:
mergify[bot]
2020-11-20 01:07:30 +00:00
committed by GitHub
parent 841f596b26
commit ff38a46af6
2 changed files with 18 additions and 10 deletions

View File

@@ -3,6 +3,7 @@ use bv::BitVec;
use fnv::FnvHasher;
use rand::{self, Rng};
use serde::{Deserialize, Serialize};
use solana_sdk::sanitize::{Sanitize, SanitizeError};
use std::fmt;
use std::sync::atomic::{AtomicU64, Ordering};
use std::{cmp, hash::Hasher, marker::PhantomData};
@@ -45,7 +46,16 @@ impl<T: BloomHashIndex> fmt::Debug for Bloom<T> {
}
}
impl<T: BloomHashIndex> solana_sdk::sanitize::Sanitize for Bloom<T> {}
impl<T: BloomHashIndex> Sanitize for Bloom<T> {
fn sanitize(&self) -> Result<(), SanitizeError> {
// Avoid division by zero in self.pos(...).
if self.bits.is_empty() {
Err(SanitizeError::InvalidValue)
} else {
Ok(())
}
}
}
impl<T: BloomHashIndex> Bloom<T> {
pub fn new(num_bits: usize, keys: Vec<u64>) -> Self {