From 8be43d1e63e1eff1e15b04ae96ddfcbd787e0186 Mon Sep 17 00:00:00 2001 From: Svyatoslav Nikolsky Date: Mon, 18 Jan 2021 20:04:50 +0300 Subject: [PATCH] fixed actual dispatch weight calculation (#658) --- bridges/modules/message-lane/src/lib.rs | 29 +++++++++++++++++++++---- 1 file changed, 25 insertions(+), 4 deletions(-) diff --git a/bridges/modules/message-lane/src/lib.rs b/bridges/modules/message-lane/src/lib.rs index 04cd9c8983..b667120f10 100644 --- a/bridges/modules/message-lane/src/lib.rs +++ b/bridges/modules/message-lane/src/lib.rs @@ -379,9 +379,9 @@ decl_module! { .messages .iter() .map(T::MessageDispatch::dispatch_weight) - .sum::() + .fold(0, |sum, weight| sum.saturating_add(&weight)) ) - .sum(); + .fold(0, |sum, weight| sum.saturating_add(weight)); if dispatch_weight < actual_dispatch_weight { frame_support::debug::trace!( "Rejecting messages proof because of dispatch weight mismatch: declared={}, expected={}", @@ -755,8 +755,8 @@ fn verify_and_decode_messages_proof, Fee, Dispatch mod tests { use super::*; use crate::mock::{ - message, run_test, Origin, TestEvent, TestMessageDeliveryAndDispatchPayment, TestMessagesProof, TestRuntime, - PAYLOAD_REJECTED_BY_TARGET_CHAIN, REGULAR_PAYLOAD, TEST_LANE_ID, TEST_RELAYER_A, TEST_RELAYER_B, + message, run_test, Origin, TestEvent, TestMessageDeliveryAndDispatchPayment, TestMessagesProof, TestPayload, + TestRuntime, PAYLOAD_REJECTED_BY_TARGET_CHAIN, REGULAR_PAYLOAD, TEST_LANE_ID, TEST_RELAYER_A, TEST_RELAYER_B, }; use bp_message_lane::UnrewardedRelayersState; use frame_support::{assert_noop, assert_ok}; @@ -1291,4 +1291,25 @@ mod tests { hex!("87f1ffe31b52878f09495ca7482df1a4e5f83cf83f2127eb47afdc35d6e43fab44a8995dd50b6657a037a7839304535b74657374").to_vec(), ); } + + #[test] + fn actual_dispatch_weight_does_not_overlow() { + run_test(|| { + let message1 = message(1, TestPayload(0, Weight::MAX / 2)); + let message2 = message(2, TestPayload(0, Weight::MAX / 2)); + let message3 = message(2, TestPayload(0, Weight::MAX / 2)); + + assert_noop!( + Module::::receive_messages_proof( + Origin::signed(1), + TEST_RELAYER_A, + // this may cause overflow if source chain storage is invalid + Ok(vec![message1, message2, message3]).into(), + 3, + 100, + ), + Error::::InvalidMessagesDispatchWeight, + ); + }); + } }