Fix more BPF alignment issues on arm64

This commit is contained in:
Michael Vines
2021-11-30 10:41:15 -08:00
parent a54fa45d5a
commit e5aa5efbac
3 changed files with 13 additions and 16 deletions

View File

@@ -3,15 +3,12 @@ use solana_rbpf::{aligned_memory::AlignedMemory, ebpf::HOST_ALIGN};
use solana_sdk::{
account::{ReadableAccount, WritableAccount},
bpf_loader_deprecated,
entrypoint::{MAX_PERMITTED_DATA_INCREASE, PARAMETER_ALIGNMENT},
entrypoint::{BPF_ALIGN_OF_U128, MAX_PERMITTED_DATA_INCREASE},
instruction::InstructionError,
keyed_account::KeyedAccount,
pubkey::Pubkey,
};
use std::{
io::prelude::*,
mem::{align_of, size_of},
};
use std::{io::prelude::*, mem::size_of};
/// Look for a duplicate account and return its position if found
pub fn is_dup(accounts: &[KeyedAccount], keyed_account: &KeyedAccount) -> (bool, usize) {
@@ -168,7 +165,7 @@ pub fn get_serialized_account_size_aligned(
+ size_of::<u64>() // data len
+ data_len
+ MAX_PERMITTED_DATA_INCREASE
+ (data_len as *const u8).align_offset(align_of::<u128>())
+ (data_len as *const u8).align_offset(BPF_ALIGN_OF_U128)
+ size_of::<u64>(), // rent epoch
)
}
@@ -227,7 +224,7 @@ pub fn serialize_parameters_aligned(
.map_err(|_| InstructionError::InvalidArgument)?;
v.resize(
MAX_PERMITTED_DATA_INCREASE
+ (v.write_index() as *const u8).align_offset(PARAMETER_ALIGNMENT),
+ (v.write_index() as *const u8).align_offset(BPF_ALIGN_OF_U128),
0,
)
.map_err(|_| InstructionError::InvalidArgument)?;
@@ -277,7 +274,7 @@ pub fn deserialize_parameters_aligned(
account.set_data_from_slice(&buffer[start..data_end]);
start += pre_len + MAX_PERMITTED_DATA_INCREASE; // data
start += (start as *const u8).align_offset(align_of::<u128>());
start += (start as *const u8).align_offset(BPF_ALIGN_OF_U128);
start += size_of::<u64>(); // rent_epoch
}
}
@@ -406,7 +403,7 @@ mod tests {
assert_eq!(&program_id, de_program_id);
assert_eq!(instruction_data, de_instruction_data);
assert_eq!(
(&de_instruction_data[0] as *const u8).align_offset(align_of::<u128>()),
(&de_instruction_data[0] as *const u8).align_offset(BPF_ALIGN_OF_U128),
0
);
for ((account, account_info), key) in accounts.iter().zip(de_accounts).zip(keys.clone()) {
@@ -419,7 +416,7 @@ mod tests {
assert_eq!(account.rent_epoch(), account_info.rent_epoch);
assert_eq!(
(*account_info.lamports.borrow() as *const u64).align_offset(align_of::<u64>()),
(*account_info.lamports.borrow() as *const u64).align_offset(BPF_ALIGN_OF_U128),
0
);
assert_eq!(
@@ -427,7 +424,7 @@ mod tests {
.data
.borrow()
.as_ptr()
.align_offset(align_of::<u128>()),
.align_offset(BPF_ALIGN_OF_U128),
0
);
}