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:
parent
8552534b61
commit
e4c3d1e7a6
|
@ -1085,8 +1085,9 @@ impl InputWeightPrediction {
|
||||||
(0usize, 0u32),
|
(0usize, 0u32),
|
||||||
|(count, total_size), elem_len| {
|
|(count, total_size), elem_len| {
|
||||||
let elem_len = *elem_len.borrow();
|
let elem_len = *elem_len.borrow();
|
||||||
let elem_size = Self::saturate_to_u32(elem_len) + Self::encoded_size(elem_len);
|
let elem_size =
|
||||||
(count + 1, total_size + 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 };
|
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.
|
/// `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 {
|
pub const fn from_slice(input_script_len: usize, witness_element_lengths: &[usize]) -> Self {
|
||||||
let mut i = 0;
|
let mut i = 0;
|
||||||
let mut total_size = 0;
|
let mut total_size: u32 = 0;
|
||||||
// for loops not supported in const fn
|
// for loops not supported in const fn
|
||||||
while i < witness_element_lengths.len() {
|
while i < witness_element_lengths.len() {
|
||||||
let elem_len = witness_element_lengths[i];
|
let elem_len = witness_element_lengths[i];
|
||||||
let elem_size = Self::saturate_to_u32(elem_len) + Self::encoded_size(elem_len);
|
let elem_size =
|
||||||
total_size += 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;
|
i += 1;
|
||||||
}
|
}
|
||||||
let witness_size = if !witness_element_lengths.is_empty() {
|
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 {
|
} else {
|
||||||
0
|
0
|
||||||
};
|
};
|
||||||
let script_size =
|
let script_size = Self::saturate_to_u32(input_script_len)
|
||||||
Self::saturate_to_u32(input_script_len) + Self::encoded_size(input_script_len);
|
.saturating_add(Self::encoded_size(input_script_len));
|
||||||
|
|
||||||
InputWeightPrediction { script_size, witness_size }
|
InputWeightPrediction { script_size, witness_size }
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue