Use saturating add in IWP constructors

In order to avoid panics during weight prediction replace addition
with `u32::saturating_add()`.
This commit is contained in:
yancy 2025-06-17 13:18:16 -05:00
parent 8552534b61
commit e4c3d1e7a6
1 changed files with 10 additions and 8 deletions

View File

@ -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 }
}