Safe desired targets call (#12826)

* checked call for desired targets

* fix compile

* fmt

* fix tests

* cleaner with and_then
This commit is contained in:
Ankan
2022-12-10 23:52:23 +01:00
committed by GitHub
parent 2f2e481d72
commit 1320daa33e
3 changed files with 18 additions and 18 deletions
@@ -1409,12 +1409,12 @@ impl<T: Config> Pallet<T> {
return Err(ElectionError::DataProvider("Snapshot too big for submission."))
}
let mut desired_targets =
T::DataProvider::desired_targets().map_err(ElectionError::DataProvider)?;
let mut desired_targets = <Pallet<T> as ElectionProviderBase>::desired_targets_checked()
.map_err(|e| ElectionError::DataProvider(e))?;
// If `desired_targets` > `targets.len()`, cap `desired_targets` to that
// level and emit a warning
let max_desired_targets: u32 = (targets.len() as u32).min(T::MaxWinners::get());
// If `desired_targets` > `targets.len()`, cap `desired_targets` to that level and emit a
// warning
let max_desired_targets: u32 = targets.len() as u32;
if desired_targets > max_desired_targets {
log!(
warn,
@@ -594,10 +594,12 @@ mod tests {
DesiredTargets::set(4);
MaxWinners::set(3);
let (_, _, actual_desired_targets) = MultiPhase::create_snapshot_external().unwrap();
// snapshot is created with min of desired_targets and MaxWinners
assert_eq!(actual_desired_targets, 3);
// snapshot not created because data provider returned an unexpected number of
// desired_targets
assert_noop!(
MultiPhase::create_snapshot_external(),
ElectionError::DataProvider("desired_targets must not be greater than MaxWinners."),
);
})
}
@@ -386,15 +386,13 @@ pub trait ElectionProviderBase {
/// checked call to `Self::DataProvider::desired_targets()` ensuring the value never exceeds
/// [`Self::MaxWinners`].
fn desired_targets_checked() -> data_provider::Result<u32> {
match Self::DataProvider::desired_targets() {
Ok(desired_targets) =>
Self::DataProvider::desired_targets().and_then(|desired_targets| {
if desired_targets <= Self::MaxWinners::get() {
Ok(desired_targets)
} else {
Err("desired_targets should not be greater than MaxWinners")
},
Err(e) => Err(e),
Err("desired_targets must not be greater than MaxWinners.")
}
})
}
}