Skip to content
Snippets Groups Projects
Unverified Commit f373af0d authored by Valery Gantchev's avatar Valery Gantchev Committed by GitHub
Browse files

Use checked math in frame-balances named_reserve (#7365)


This PR modifies `named_reserve()` in frame-balances to use checked math
instead of defensive saturating math.

The use of saturating math relies on the assumption that the sum of the
values will always fit in `u128::MAX`. However, there is nothing
preventing the implementing pallet from passing a larger value which
overflows. This can happen if the implementing pallet does not validate
user input and instead relies on `named_reserve()` to return an error
(this saves an additional read)

This is not a security concern, as the method will subsequently return
an error thanks to `<Self as ReservableCurrency<_>>::reserve(who,
value)?;`. However, the `defensive_saturating_add` will panic in
`--all-features`, creating false positive crashes in fuzzing operations.

---------

Co-authored-by: default avatarcmd[bot] <41898282+github-actions[bot]@users.noreply.github.com>
parent 0dab441c
No related merge requests found
Pipeline #513546 waiting for manual action with stages
in 41 minutes and 31 seconds
title: Use checked math in frame-balances named_reserve
doc:
- audience: Runtime Dev
description: |-
This PR modifies `named_reserve()` in frame-balances to use checked math instead of defensive saturating math.
The use of saturating math relies on the assumption that the value will always fit in `u128::MAX`. However, there is nothing preventing the implementing pallet from passing a larger value which overflows. This can happen if the implementing pallet does not validate user input and instead relies on `named_reserve()` to return an error (this saves an additional read)
This is not a security concern, as the method will subsequently return an error thanks to `<Self as ReservableCurrency<_>>::reserve(who, value)?;`. However, the `defensive_saturating_add` will panic in `--all-features`, creating false positive crashes in fuzzing operations.
crates:
- name: pallet-balances
bump: patch
......@@ -674,8 +674,10 @@ where
Reserves::<T, I>::try_mutate(who, |reserves| -> DispatchResult {
match reserves.binary_search_by_key(id, |data| data.id) {
Ok(index) => {
// this add can't overflow but just to be defensive.
reserves[index].amount = reserves[index].amount.defensive_saturating_add(value);
reserves[index].amount = reserves[index]
.amount
.checked_add(&value)
.ok_or(ArithmeticError::Overflow)?;
},
Err(index) => {
reserves
......
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment