Replaces unchecked integer arithmetic by guarded versions. (#21186)

This commit is contained in:
Alexander Meißner
2021-11-09 13:35:49 +01:00
committed by GitHub
parent b4d09388aa
commit 067e29ae0b
4 changed files with 42 additions and 26 deletions

View File

@ -300,8 +300,9 @@ impl<'a> InvokeContext for ThisInvokeContext<'a> {
.try_borrow_mut()
.map_err(|_| InstructionError::AccountBorrowOutstanding)?;
}
let pre_account = &self.pre_accounts[unique_index];
let account = self.accounts[account_index].1.borrow();
self.pre_accounts[unique_index]
pre_account
.verify(
program_id,
message.is_writable(account_index, demote_program_write_locks),
@ -315,13 +316,17 @@ impl<'a> InvokeContext for ThisInvokeContext<'a> {
ic_logger_msg!(
self.logger,
"failed to verify account {}: {}",
self.pre_accounts[unique_index].key(),
pre_account.key(),
err
);
err
})?;
pre_sum += u128::from(self.pre_accounts[unique_index].lamports());
post_sum += u128::from(account.lamports());
pre_sum = pre_sum
.checked_add(u128::from(pre_account.lamports()))
.ok_or(InstructionError::UnbalancedInstruction)?;
post_sum = post_sum
.checked_add(u128::from(account.lamports()))
.ok_or(InstructionError::UnbalancedInstruction)?;
Ok(())
};
instruction.visit_each_account(&mut work)?;
@ -383,8 +388,12 @@ impl<'a> InvokeContext for ThisInvokeContext<'a> {
ic_logger_msg!(logger, "failed to verify account {}: {}", key, err);
err
})?;
pre_sum += u128::from(pre_account.lamports());
post_sum += u128::from(account.lamports());
pre_sum = pre_sum
.checked_add(u128::from(pre_account.lamports()))
.ok_or(InstructionError::UnbalancedInstruction)?;
post_sum = post_sum
.checked_add(u128::from(account.lamports()))
.ok_or(InstructionError::UnbalancedInstruction)?;
if is_writable && !pre_account.executable() {
pre_account.update(&account);
}
@ -466,10 +475,10 @@ impl<'a> InvokeContext for ThisInvokeContext<'a> {
execute_us: u64,
deserialize_us: u64,
) {
self.timings.serialize_us += serialize_us;
self.timings.create_vm_us += create_vm_us;
self.timings.execute_us += execute_us;
self.timings.deserialize_us += deserialize_us;
self.timings.serialize_us = self.timings.serialize_us.saturating_add(serialize_us);
self.timings.create_vm_us = self.timings.create_vm_us.saturating_add(create_vm_us);
self.timings.execute_us = self.timings.execute_us.saturating_add(execute_us);
self.timings.deserialize_us = self.timings.deserialize_us.saturating_add(deserialize_us);
}
fn get_sysvars(&self) -> &[(Pubkey, Vec<u8>)] {
self.sysvars
@ -664,6 +673,7 @@ mod tests {
ModifyReadonly,
}
#[allow(clippy::integer_arithmetic)]
fn mock_process_instruction(
first_instruction_account: usize,
data: &[u8],