Introduces `Result` return types to mutable accessors of `BorrowedAccount` (#25380)

* Introduces result return types to get_data_mut(), set_data() and set_data_length() of BorrowedAccount.

* Introduces result return types to set_owner(), set_lamports() and set_executable() of BorrowedAccount.
This commit is contained in:
Alexander Meißner 2022-05-21 17:47:09 +02:00 committed by GitHub
parent 10d677a092
commit 7eae98c6d9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 51 additions and 45 deletions

View File

@ -1404,13 +1404,16 @@ mod tests {
MockInstruction::NoopFail => return Err(InstructionError::GenericError), MockInstruction::NoopFail => return Err(InstructionError::GenericError),
MockInstruction::ModifyOwned => instruction_context MockInstruction::ModifyOwned => instruction_context
.try_borrow_instruction_account(transaction_context, 0)? .try_borrow_instruction_account(transaction_context, 0)?
.set_data(&[1]), .set_data(&[1])
.unwrap(),
MockInstruction::ModifyNotOwned => instruction_context MockInstruction::ModifyNotOwned => instruction_context
.try_borrow_instruction_account(transaction_context, 1)? .try_borrow_instruction_account(transaction_context, 1)?
.set_data(&[1]), .set_data(&[1])
.unwrap(),
MockInstruction::ModifyReadonly => instruction_context MockInstruction::ModifyReadonly => instruction_context
.try_borrow_instruction_account(transaction_context, 2)? .try_borrow_instruction_account(transaction_context, 2)?
.set_data(&[1]), .set_data(&[1])
.unwrap(),
MockInstruction::ConsumeComputeUnits { MockInstruction::ConsumeComputeUnits {
compute_units_to_consume, compute_units_to_consume,
desired_result, desired_result,
@ -1424,7 +1427,8 @@ mod tests {
} }
MockInstruction::Resize { new_len } => instruction_context MockInstruction::Resize { new_len } => instruction_context
.try_borrow_instruction_account(transaction_context, 0)? .try_borrow_instruction_account(transaction_context, 0)?
.set_data(&vec![0; new_len]), .set_data(&vec![0; new_len])
.unwrap(),
} }
} else { } else {
return Err(InstructionError::InvalidInstructionData); return Err(InstructionError::InvalidInstructionData);

View File

@ -182,8 +182,8 @@ pub fn builtin_process_instruction(
let mut borrowed_account = let mut borrowed_account =
instruction_context.try_borrow_account(transaction_context, index_in_instruction)?; instruction_context.try_borrow_account(transaction_context, index_in_instruction)?;
if borrowed_account.is_writable() { if borrowed_account.is_writable() {
borrowed_account.set_lamports(lamports); borrowed_account.set_lamports(lamports)?;
borrowed_account.set_data(&data); borrowed_account.set_data(&data)?;
} }
} }

View File

@ -208,7 +208,7 @@ impl Processor {
let mut lookup_table_meta = lookup_table.meta; let mut lookup_table_meta = lookup_table.meta;
lookup_table_meta.authority = None; lookup_table_meta.authority = None;
AddressLookupTable::overwrite_meta_data( AddressLookupTable::overwrite_meta_data(
lookup_table_account.get_data_mut(), lookup_table_account.get_data_mut()?,
lookup_table_meta, lookup_table_meta,
)?; )?;
@ -301,12 +301,12 @@ impl Processor {
)?; )?;
{ {
let mut table_data = lookup_table_account.get_data_mut().to_vec(); let mut table_data = lookup_table_account.get_data_mut()?.to_vec();
AddressLookupTable::overwrite_meta_data(&mut table_data, lookup_table_meta)?; AddressLookupTable::overwrite_meta_data(&mut table_data, lookup_table_meta)?;
for new_address in new_addresses { for new_address in new_addresses {
table_data.extend_from_slice(new_address.as_ref()); table_data.extend_from_slice(new_address.as_ref());
} }
lookup_table_account.set_data(&table_data); lookup_table_account.set_data(&table_data)?;
} }
drop(lookup_table_account); drop(lookup_table_account);
@ -380,7 +380,7 @@ impl Processor {
lookup_table_meta.deactivation_slot = clock.slot; lookup_table_meta.deactivation_slot = clock.slot;
AddressLookupTable::overwrite_meta_data( AddressLookupTable::overwrite_meta_data(
lookup_table_account.get_data_mut(), lookup_table_account.get_data_mut()?,
lookup_table_meta, lookup_table_meta,
)?; )?;
@ -468,8 +468,8 @@ impl Processor {
let mut lookup_table_account = let mut lookup_table_account =
instruction_context.try_borrow_instruction_account(transaction_context, 0)?; instruction_context.try_borrow_instruction_account(transaction_context, 0)?;
lookup_table_account.set_data(&[]); lookup_table_account.set_data(&[])?;
lookup_table_account.set_lamports(0); lookup_table_account.set_lamports(0)?;
Ok(()) Ok(())
} }

View File

@ -225,7 +225,7 @@ fn write_program_data(
let instruction_context = transaction_context.get_current_instruction_context()?; let instruction_context = transaction_context.get_current_instruction_context()?;
let mut program = let mut program =
instruction_context.try_borrow_account(transaction_context, program_account_index)?; instruction_context.try_borrow_account(transaction_context, program_account_index)?;
let data = program.get_data_mut(); let data = program.get_data_mut()?;
let write_offset = program_data_offset.saturating_add(bytes.len()); let write_offset = program_data_offset.saturating_add(bytes.len());
if data.len() < write_offset { if data.len() < write_offset {
ic_msg!( ic_msg!(
@ -600,7 +600,7 @@ fn process_loader_upgradeable_instruction(
drop(payer); drop(payer);
let mut buffer = let mut buffer =
instruction_context.try_borrow_instruction_account(transaction_context, 3)?; instruction_context.try_borrow_instruction_account(transaction_context, 3)?;
buffer.set_lamports(0); buffer.set_lamports(0)?;
} }
let mut instruction = system_instruction::create_account( let mut instruction = system_instruction::create_account(
@ -650,7 +650,7 @@ fn process_loader_upgradeable_instruction(
upgrade_authority_address: authority_key, upgrade_authority_address: authority_key,
})?; })?;
let dst_slice = programdata let dst_slice = programdata
.get_data_mut() .get_data_mut()?
.get_mut( .get_mut(
programdata_data_offset programdata_data_offset
..programdata_data_offset.saturating_add(buffer_data_len), ..programdata_data_offset.saturating_add(buffer_data_len),
@ -671,7 +671,7 @@ fn process_loader_upgradeable_instruction(
program.set_state(&UpgradeableLoaderState::Program { program.set_state(&UpgradeableLoaderState::Program {
programdata_address: programdata_key, programdata_address: programdata_key,
})?; })?;
program.set_executable(true); program.set_executable(true)?;
drop(program); drop(program);
if !predrain_buffer { if !predrain_buffer {
@ -682,7 +682,7 @@ fn process_loader_upgradeable_instruction(
drop(payer); drop(payer);
let mut buffer = let mut buffer =
instruction_context.try_borrow_instruction_account(transaction_context, 3)?; instruction_context.try_borrow_instruction_account(transaction_context, 3)?;
buffer.set_lamports(0); buffer.set_lamports(0)?;
} }
ic_logger_msg!(log_collector, "Deployed program {:?}", new_program_id); ic_logger_msg!(log_collector, "Deployed program {:?}", new_program_id);
@ -833,7 +833,7 @@ fn process_loader_upgradeable_instruction(
upgrade_authority_address: authority_key, upgrade_authority_address: authority_key,
})?; })?;
let dst_slice = programdata let dst_slice = programdata
.get_data_mut() .get_data_mut()?
.get_mut( .get_mut(
programdata_data_offset programdata_data_offset
..programdata_data_offset.saturating_add(buffer_data_len), ..programdata_data_offset.saturating_add(buffer_data_len),
@ -848,7 +848,7 @@ fn process_loader_upgradeable_instruction(
dst_slice.copy_from_slice(src_slice); dst_slice.copy_from_slice(src_slice);
} }
programdata programdata
.get_data_mut() .get_data_mut()?
.get_mut(programdata_data_offset.saturating_add(buffer_data_len)..) .get_mut(programdata_data_offset.saturating_add(buffer_data_len)..)
.ok_or(InstructionError::AccountDataTooSmall)? .ok_or(InstructionError::AccountDataTooSmall)?
.fill(0); .fill(0);
@ -856,12 +856,12 @@ fn process_loader_upgradeable_instruction(
// Fund ProgramData to rent-exemption, spill the rest // Fund ProgramData to rent-exemption, spill the rest
let programdata_lamports = programdata.get_lamports(); let programdata_lamports = programdata.get_lamports();
programdata.set_lamports(programdata_balance_required); programdata.set_lamports(programdata_balance_required)?;
drop(programdata); drop(programdata);
let mut buffer = let mut buffer =
instruction_context.try_borrow_instruction_account(transaction_context, 2)?; instruction_context.try_borrow_instruction_account(transaction_context, 2)?;
buffer.set_lamports(0); buffer.set_lamports(0)?;
drop(buffer); drop(buffer);
let mut spill = let mut spill =
@ -962,7 +962,7 @@ fn process_loader_upgradeable_instruction(
match close_account.get_state()? { match close_account.get_state()? {
UpgradeableLoaderState::Uninitialized => { UpgradeableLoaderState::Uninitialized => {
let close_lamports = close_account.get_lamports(); let close_lamports = close_account.get_lamports();
close_account.set_lamports(0); close_account.set_lamports(0)?;
drop(close_account); drop(close_account);
let mut recipient_account = instruction_context let mut recipient_account = instruction_context
.try_borrow_instruction_account(transaction_context, 1)?; .try_borrow_instruction_account(transaction_context, 1)?;
@ -1070,7 +1070,7 @@ fn common_close_account(
let mut recipient_account = let mut recipient_account =
instruction_context.try_borrow_instruction_account(transaction_context, 1)?; instruction_context.try_borrow_instruction_account(transaction_context, 1)?;
recipient_account.checked_add_lamports(close_account.get_lamports())?; recipient_account.checked_add_lamports(close_account.get_lamports())?;
close_account.set_lamports(0); close_account.set_lamports(0)?;
close_account.set_state(&UpgradeableLoaderState::Uninitialized)?; close_account.set_state(&UpgradeableLoaderState::Uninitialized)?;
Ok(()) Ok(())
} }
@ -1127,7 +1127,7 @@ fn process_loader_instruction(
let mut program = let mut program =
instruction_context.try_borrow_instruction_account(transaction_context, 0)?; instruction_context.try_borrow_instruction_account(transaction_context, 0)?;
invoke_context.update_executor(program.get_key(), executor); invoke_context.update_executor(program.get_key(), executor);
program.set_executable(true); program.set_executable(true)?;
ic_msg!(invoke_context, "Finalized account {:?}", program.get_key()); ic_msg!(invoke_context, "Finalized account {:?}", program.get_key());
} }
} }

View File

@ -134,7 +134,7 @@ pub fn process_instruction(
ic_msg!(invoke_context, "instruction data too large"); ic_msg!(invoke_context, "instruction data too large");
return Err(InstructionError::InvalidInstructionData); return Err(InstructionError::InvalidInstructionData);
} }
config_account.get_data_mut()[..data.len()].copy_from_slice(data); config_account.get_data_mut()?[..data.len()].copy_from_slice(data);
Ok(()) Ok(())
} }

View File

@ -16246,7 +16246,7 @@ pub(crate) mod tests {
let instruction_context = transaction_context.get_current_instruction_context()?; let instruction_context = transaction_context.get_current_instruction_context()?;
instruction_context instruction_context
.try_borrow_instruction_account(transaction_context, 1)? .try_borrow_instruction_account(transaction_context, 1)?
.set_data(&[0; 40]); .set_data(&[0; 40])?;
Ok(()) Ok(())
} }
@ -17866,7 +17866,7 @@ pub(crate) mod tests {
// Set data length // Set data length
instruction_context instruction_context
.try_borrow_instruction_account(transaction_context, 1)? .try_borrow_instruction_account(transaction_context, 1)?
.set_data_length(new_size); .set_data_length(new_size)?;
// set balance // set balance
let current_balance = instruction_context let current_balance = instruction_context
@ -17880,14 +17880,14 @@ pub(crate) mod tests {
.checked_sub_lamports(amount)?; .checked_sub_lamports(amount)?;
instruction_context instruction_context
.try_borrow_instruction_account(transaction_context, 1)? .try_borrow_instruction_account(transaction_context, 1)?
.set_lamports(new_balance); .set_lamports(new_balance)?;
} else { } else {
instruction_context instruction_context
.try_borrow_instruction_account(transaction_context, 0)? .try_borrow_instruction_account(transaction_context, 0)?
.checked_add_lamports(amount)?; .checked_add_lamports(amount)?;
instruction_context instruction_context
.try_borrow_instruction_account(transaction_context, 1)? .try_borrow_instruction_account(transaction_context, 1)?
.set_lamports(new_balance); .set_lamports(new_balance)?;
} }
Ok(()) Ok(())
} }

View File

@ -239,7 +239,7 @@ mod tests {
MockSystemInstruction::ChangeData { data } => { MockSystemInstruction::ChangeData { data } => {
instruction_context instruction_context
.try_borrow_instruction_account(transaction_context, 1)? .try_borrow_instruction_account(transaction_context, 1)?
.set_data(&[data]); .set_data(&[data])?;
Ok(()) Ok(())
} }
} }
@ -457,7 +457,7 @@ mod tests {
.try_borrow_instruction_account(transaction_context, 2)?; .try_borrow_instruction_account(transaction_context, 2)?;
dup_account.checked_sub_lamports(lamports)?; dup_account.checked_sub_lamports(lamports)?;
to_account.checked_add_lamports(lamports)?; to_account.checked_add_lamports(lamports)?;
dup_account.set_data(&[data]); dup_account.set_data(&[data])?;
drop(dup_account); drop(dup_account);
let mut from_account = instruction_context let mut from_account = instruction_context
.try_borrow_instruction_account(transaction_context, 0)?; .try_borrow_instruction_account(transaction_context, 0)?;

View File

@ -106,7 +106,7 @@ fn allocate(
return Err(SystemError::InvalidAccountDataLength.into()); return Err(SystemError::InvalidAccountDataLength.into());
} }
account.set_data(&vec![0; space as usize]); account.set_data(&vec![0; space as usize])?;
Ok(()) Ok(())
} }
@ -128,8 +128,7 @@ fn assign(
return Err(InstructionError::MissingRequiredSignature); return Err(InstructionError::MissingRequiredSignature);
} }
account.set_owner(&owner.to_bytes()); account.set_owner(&owner.to_bytes())
Ok(())
} }
fn allocate_and_assign( fn allocate_and_assign(

View File

@ -512,8 +512,9 @@ impl<'a> BorrowedAccount<'a> {
} }
/// Assignes the owner of this account (transaction wide) /// Assignes the owner of this account (transaction wide)
pub fn set_owner(&mut self, pubkey: &[u8]) { pub fn set_owner(&mut self, pubkey: &[u8]) -> Result<(), InstructionError> {
self.account.copy_into_owner_from_slice(pubkey); self.account.copy_into_owner_from_slice(pubkey);
Ok(())
} }
/// Returns the number of lamports of this account (transaction wide) /// Returns the number of lamports of this account (transaction wide)
@ -522,8 +523,9 @@ impl<'a> BorrowedAccount<'a> {
} }
/// Overwrites the number of lamports of this account (transaction wide) /// Overwrites the number of lamports of this account (transaction wide)
pub fn set_lamports(&mut self, lamports: u64) { pub fn set_lamports(&mut self, lamports: u64) -> Result<(), InstructionError> {
self.account.set_lamports(lamports); self.account.set_lamports(lamports);
Ok(())
} }
/// Adds lamports to this account (transaction wide) /// Adds lamports to this account (transaction wide)
@ -532,8 +534,7 @@ impl<'a> BorrowedAccount<'a> {
self.get_lamports() self.get_lamports()
.checked_add(lamports) .checked_add(lamports)
.ok_or(LamportsError::ArithmeticOverflow)?, .ok_or(LamportsError::ArithmeticOverflow)?,
); )
Ok(())
} }
/// Subtracts lamports from this account (transaction wide) /// Subtracts lamports from this account (transaction wide)
@ -542,8 +543,7 @@ impl<'a> BorrowedAccount<'a> {
self.get_lamports() self.get_lamports()
.checked_sub(lamports) .checked_sub(lamports)
.ok_or(LamportsError::ArithmeticUnderflow)?, .ok_or(LamportsError::ArithmeticUnderflow)?,
); )
Ok(())
} }
/// Returns a read-only slice of the account data (transaction wide) /// Returns a read-only slice of the account data (transaction wide)
@ -552,24 +552,26 @@ impl<'a> BorrowedAccount<'a> {
} }
/// Returns a writable slice of the account data (transaction wide) /// Returns a writable slice of the account data (transaction wide)
pub fn get_data_mut(&mut self) -> &mut [u8] { pub fn get_data_mut(&mut self) -> Result<&mut [u8], InstructionError> {
self.account.data_as_mut_slice() Ok(self.account.data_as_mut_slice())
} }
/// Overwrites the account data and size (transaction wide) /// Overwrites the account data and size (transaction wide)
pub fn set_data(&mut self, data: &[u8]) { pub fn set_data(&mut self, data: &[u8]) -> Result<(), InstructionError> {
if data.len() == self.account.data().len() { if data.len() == self.account.data().len() {
self.account.data_as_mut_slice().copy_from_slice(data); self.account.data_as_mut_slice().copy_from_slice(data);
} else { } else {
self.account.set_data_from_slice(data); self.account.set_data_from_slice(data);
} }
Ok(())
} }
/// Resizes the account data (transaction wide) /// Resizes the account data (transaction wide)
/// ///
/// Fills it with zeros at the end if is extended or truncates at the end otherwise. /// Fills it with zeros at the end if is extended or truncates at the end otherwise.
pub fn set_data_length(&mut self, new_len: usize) { pub fn set_data_length(&mut self, new_len: usize) -> Result<(), InstructionError> {
self.account.data_mut().resize(new_len, 0); self.account.data_mut().resize(new_len, 0);
Ok(())
} }
/// Deserializes the account data into a state /// Deserializes the account data into a state
@ -597,8 +599,9 @@ impl<'a> BorrowedAccount<'a> {
} }
/// Configures whether this account is executable (transaction wide) /// Configures whether this account is executable (transaction wide)
pub fn set_executable(&mut self, is_executable: bool) { pub fn set_executable(&mut self, is_executable: bool) -> Result<(), InstructionError> {
self.account.set_executable(is_executable); self.account.set_executable(is_executable);
Ok(())
} }
/// Returns the rent epoch of this account (transaction wide) /// Returns the rent epoch of this account (transaction wide)