Avoid multisig reentrancy (#6445)

This commit is contained in:
Gavin Wood
2020-06-19 20:12:42 +02:00
committed by GitHub
parent 8c1a23a08b
commit 9ee2427289
+5 -2
View File
@@ -553,10 +553,13 @@ impl<T: Trait> Module<T> {
// verify weight
ensure!(call.get_dispatch_info().weight <= max_weight, Error::<T>::WeightTooLow);
let result = call.dispatch(RawOrigin::Signed(id.clone()).into());
T::Currency::unreserve(&m.depositor, m.deposit);
// Clean up storage before executing call to avoid an possibility of reentrancy
// attack.
<Multisigs<T>>::remove(&id, call_hash);
Self::clear_call(&call_hash);
T::Currency::unreserve(&m.depositor, m.deposit);
let result = call.dispatch(RawOrigin::Signed(id.clone()).into());
Self::deposit_event(RawEvent::MultisigExecuted(
who, timepoint, id, call_hash, result.map(|_| ()).map_err(|e| e.error)
));