Skip to content

Commit 8b366be

Browse files
committed
add access checks
1 parent 07b8d19 commit 8b366be

File tree

2 files changed

+68
-57
lines changed

2 files changed

+68
-57
lines changed

programs/system/src/errors.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,10 @@ pub enum SystemProgramError {
126126
InvalidAccountIndex,
127127
#[error("Account compression CPI data exceeds 10KB limit")]
128128
AccountCompressionCpiDataExceedsLimit,
129+
#[error("AddressOwnerIndexOutOfBounds")]
130+
AddressOwnerIndexOutOfBounds,
131+
#[error("AddressAssignedAccountIndexOutOfBounds")]
132+
AddressAssignedAccountIndexOutOfBounds,
129133
#[error("Batched Merkle tree error {0}")]
130134
BatchedMerkleTreeError(#[from] BatchedMerkleTreeError),
131135
#[error("Concurrent Merkle tree error {0}")]
@@ -202,6 +206,8 @@ impl From<SystemProgramError> for u32 {
202206
SystemProgramError::InvalidCpiContextDiscriminator => 6056,
203207
SystemProgramError::InvalidAccountIndex => 6057,
204208
SystemProgramError::AccountCompressionCpiDataExceedsLimit => 6058,
209+
SystemProgramError::AddressOwnerIndexOutOfBounds => 6059,
210+
SystemProgramError::AddressAssignedAccountIndexOutOfBounds => 6060,
205211
SystemProgramError::BatchedMerkleTreeError(e) => e.into(),
206212
SystemProgramError::IndexedMerkleTreeError(e) => e.into(),
207213
SystemProgramError::ConcurrentMerkleTreeError(e) => e.into(),

programs/system/src/processor/create_address_cpi_data.rs

Lines changed: 62 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -23,70 +23,75 @@ pub fn derive_new_addresses<'info, 'a, 'b: 'a, const ADDRESS_ASSIGNMENT: bool>(
2323
accounts: &[AcpAccount<'info>],
2424
) -> Result<()> {
2525
let mut seq_index = 0;
26-
let invoking_program_id_clone = context.invoking_program_id;
26+
let invoking_program_id_clone = context
27+
.invoking_program_id
28+
.ok_or(SystemProgramError::DeriveAddressError)?;
2729

2830
for (i, new_address_params) in new_address_params.enumerate() {
29-
let (address, rollover_fee) =
30-
match &accounts[new_address_params.address_merkle_tree_account_index() as usize] {
31-
AcpAccount::AddressTree((pubkey, _)) => {
32-
cpi_ix_data.addresses[i].queue_index = context.get_index_or_insert(
33-
new_address_params.address_queue_index(),
34-
remaining_accounts,
35-
);
36-
cpi_ix_data.addresses[i].tree_index = context.get_index_or_insert(
37-
new_address_params.address_merkle_tree_account_index(),
38-
remaining_accounts,
39-
);
31+
let (address, rollover_fee) = match &accounts
32+
.get(new_address_params.address_merkle_tree_account_index() as usize)
33+
.ok_or(SystemProgramError::AddressAssignedAccountIndexOutOfBounds)?
34+
{
35+
AcpAccount::AddressTree((pubkey, _)) => {
36+
cpi_ix_data.addresses[i].queue_index = context.get_index_or_insert(
37+
new_address_params.address_queue_index(),
38+
remaining_accounts,
39+
);
40+
cpi_ix_data.addresses[i].tree_index = context.get_index_or_insert(
41+
new_address_params.address_merkle_tree_account_index(),
42+
remaining_accounts,
43+
);
4044

41-
(
42-
derive_address_legacy(pubkey, &new_address_params.seed())
43-
.map_err(ProgramError::from)?,
44-
context
45-
.get_legacy_merkle_context(new_address_params.address_queue_index())
46-
.unwrap()
47-
.rollover_fee,
48-
)
49-
}
50-
AcpAccount::BatchedAddressTree(tree) => {
51-
let invoking_program_id_bytes = if let Some(ref bytes) = address_owners[i] {
52-
Ok(bytes.to_bytes())
53-
} else if let Some(ref bytes) = invoking_program_id_clone {
54-
Ok(*bytes)
55-
} else {
56-
Err(SystemProgramError::DeriveAddressError)
57-
}?;
45+
(
46+
derive_address_legacy(pubkey, &new_address_params.seed())
47+
.map_err(ProgramError::from)?,
48+
context
49+
.get_legacy_merkle_context(new_address_params.address_queue_index())
50+
.unwrap()
51+
.rollover_fee,
52+
)
53+
}
54+
AcpAccount::BatchedAddressTree(tree) => {
55+
let invoking_program_id_bytes = if let Some(bytes) = &address_owners
56+
.get(i)
57+
.ok_or(SystemProgramError::AddressAssignedAccountIndexOutOfBounds)?
58+
{
59+
bytes.to_bytes()
60+
} else {
61+
invoking_program_id_clone
62+
};
5863

59-
cpi_ix_data.addresses[i].tree_index = context.get_index_or_insert(
60-
new_address_params.address_merkle_tree_account_index(),
61-
remaining_accounts,
62-
);
64+
cpi_ix_data.addresses[i].tree_index = context.get_index_or_insert(
65+
new_address_params.address_merkle_tree_account_index(),
66+
remaining_accounts,
67+
);
6368

64-
context.set_address_fee(
65-
tree.metadata.rollover_metadata.network_fee,
66-
new_address_params.address_merkle_tree_account_index(),
67-
);
69+
context.set_address_fee(
70+
tree.metadata.rollover_metadata.network_fee,
71+
new_address_params.address_merkle_tree_account_index(),
72+
);
6873

69-
cpi_ix_data.insert_address_sequence_number(
70-
&mut seq_index,
71-
tree.pubkey(),
72-
tree.queue_batches.next_index,
73-
);
74+
cpi_ix_data.insert_address_sequence_number(
75+
&mut seq_index,
76+
tree.pubkey(),
77+
tree.queue_batches.next_index,
78+
);
7479

75-
(
76-
derive_address(
77-
&new_address_params.seed(),
78-
&tree.pubkey().to_bytes(),
79-
&invoking_program_id_bytes,
80-
),
81-
tree.metadata.rollover_metadata.rollover_fee,
82-
)
83-
}
84-
_ => {
85-
return Err(ProgramError::from(
86-
SystemProgramError::AddressMerkleTreeAccountDiscriminatorMismatch,
87-
))
88-
}
89-
};
80+
(
81+
derive_address(
82+
&new_address_params.seed(),
83+
&tree.pubkey().to_bytes(),
84+
&invoking_program_id_bytes,
85+
),
86+
tree.metadata.rollover_metadata.rollover_fee,
87+
)
88+
}
89+
_ => {
90+
return Err(ProgramError::from(
91+
SystemProgramError::AddressMerkleTreeAccountDiscriminatorMismatch,
92+
))
93+
}
94+
};
9095
if !ADDRESS_ASSIGNMENT {
9196
// We are inserting addresses into two vectors to avoid unwrapping
9297
// the option in following functions.

0 commit comments

Comments
 (0)