Skip to content

Commit

Permalink
Safe desired targets call (paritytech#12826)
Browse files Browse the repository at this point in the history
* checked call for desired targets

* fix compile

* fmt

* fix tests

* cleaner with and_then
  • Loading branch information
Ank4n authored and ark0f committed Feb 27, 2023
1 parent efd2889 commit af84199
Show file tree
Hide file tree
Showing 3 changed files with 18 additions and 18 deletions.
10 changes: 5 additions & 5 deletions frame/election-provider-multi-phase/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
10 changes: 6 additions & 4 deletions frame/election-provider-multi-phase/src/signed.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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."),
);
})
}

Expand Down
16 changes: 7 additions & 9 deletions frame/election-provider-support/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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) =>
if desired_targets <= Self::MaxWinners::get() {
Ok(desired_targets)
} else {
Err("desired_targets should not be greater than MaxWinners")
},
Err(e) => Err(e),
}
Self::DataProvider::desired_targets().and_then(|desired_targets| {
if desired_targets <= Self::MaxWinners::get() {
Ok(desired_targets)
} else {
Err("desired_targets must not be greater than MaxWinners.")
}
})
}
}

Expand Down

0 comments on commit af84199

Please sign in to comment.