mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-06-11 03:41:06 +00:00
Fix transfer overflow exploit. (#824)
This commit is contained in:
committed by
Gav Wood
parent
acc83202bc
commit
0d284c0195
@@ -287,7 +287,10 @@ impl<T: Trait> Module<T> {
|
||||
let to_balance = Self::free_balance(&dest);
|
||||
let would_create = to_balance.is_zero();
|
||||
let fee = if would_create { Self::creation_fee() } else { Self::transfer_fee() };
|
||||
let liability = value + fee;
|
||||
let liability = match value.checked_add(&fee) {
|
||||
Some(l) => l,
|
||||
None => return Err("got overflow after adding a fee to value"),
|
||||
};
|
||||
|
||||
let new_from_balance = match from_balance.checked_sub(&liability) {
|
||||
Some(b) => b,
|
||||
|
||||
@@ -471,3 +471,19 @@ fn account_removal_on_free_too_low() {
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn transfer_overflow_isnt_exploitable() {
|
||||
with_externalities(
|
||||
&mut ExtBuilder::default().creation_fee(50).build(),
|
||||
|| {
|
||||
// Craft a value that will overflow if summed with `creation_fee`.
|
||||
let evil_value = u64::max_value() - 49;
|
||||
|
||||
assert_err!(
|
||||
Balances::transfer(Some(1).into(), 5.into(), evil_value),
|
||||
"got overflow after adding a fee to value"
|
||||
);
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user