From e4c3d1e7a62a446d930e2a73dc98415999aefdcb Mon Sep 17 00:00:00 2001 From: yancy Date: Tue, 17 Jun 2025 13:18:16 -0500 Subject: [PATCH] Use saturating add in IWP constructors In order to avoid panics during weight prediction replace addition with `u32::saturating_add()`. --- bitcoin/src/blockdata/transaction.rs | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/bitcoin/src/blockdata/transaction.rs b/bitcoin/src/blockdata/transaction.rs index f9a31b30b..690996ece 100644 --- a/bitcoin/src/blockdata/transaction.rs +++ b/bitcoin/src/blockdata/transaction.rs @@ -1085,8 +1085,9 @@ impl InputWeightPrediction { (0usize, 0u32), |(count, total_size), elem_len| { let elem_len = *elem_len.borrow(); - let elem_size = Self::saturate_to_u32(elem_len) + Self::encoded_size(elem_len); - (count + 1, total_size + elem_size) + let elem_size = + Self::saturate_to_u32(elem_len).saturating_add(Self::encoded_size(elem_len)); + (count + 1, total_size.saturating_add(elem_size)) }, ); let witness_size = if count > 0 { total_size + Self::encoded_size(count) } else { 0 }; @@ -1103,21 +1104,22 @@ impl InputWeightPrediction { /// `new` and thus is intended to be only used in `const` context. pub const fn from_slice(input_script_len: usize, witness_element_lengths: &[usize]) -> Self { let mut i = 0; - let mut total_size = 0; + let mut total_size: u32 = 0; // for loops not supported in const fn while i < witness_element_lengths.len() { let elem_len = witness_element_lengths[i]; - let elem_size = Self::saturate_to_u32(elem_len) + Self::encoded_size(elem_len); - total_size += elem_size; + let elem_size = + Self::saturate_to_u32(elem_len).saturating_add(Self::encoded_size(elem_len)); + total_size = total_size.saturating_add(elem_size); i += 1; } let witness_size = if !witness_element_lengths.is_empty() { - total_size + Self::encoded_size(witness_element_lengths.len()) + total_size.saturating_add(Self::encoded_size(witness_element_lengths.len())) } else { 0 }; - let script_size = - Self::saturate_to_u32(input_script_len) + Self::encoded_size(input_script_len); + let script_size = Self::saturate_to_u32(input_script_len) + .saturating_add(Self::encoded_size(input_script_len)); InputWeightPrediction { script_size, witness_size } }