diff --git a/programs/bpf_loader/src/serialization.rs b/programs/bpf_loader/src/serialization.rs index 87137efa1a..25ac540b5b 100644 --- a/programs/bpf_loader/src/serialization.rs +++ b/programs/bpf_loader/src/serialization.rs @@ -147,9 +147,10 @@ pub fn serialize_parameters_aligned( v.write_u64::(keyed_account.data_len()? as u64) .unwrap(); v.write_all(&keyed_account.try_account_ref()?.data).unwrap(); - for _ in 0..16 - (v.len() % 16) { - v.write_u8(0).unwrap(); // 128 bit aligned again - } + v.resize( + v.len() + (v.len() as *const u8).align_offset(align_of::()), + 0, + ); v.write_u64::(keyed_account.rent_epoch()? as u64) .unwrap(); } @@ -188,7 +189,7 @@ pub fn deserialize_parameters_aligned( .data .clone_from_slice(&buffer[start..end]); start += keyed_account.data_len()?; // data - start += 16 - (start % 16); // padding + start += (start as *const u8).align_offset(align_of::()); start += mem::size_of::(); // rent_epoch } else { start += 7; // padding diff --git a/programs/bpf_loader/test_elfs/noop_aligned.so b/programs/bpf_loader/test_elfs/noop_aligned.so index 28bbdc0980..b466240811 100755 Binary files a/programs/bpf_loader/test_elfs/noop_aligned.so and b/programs/bpf_loader/test_elfs/noop_aligned.so differ diff --git a/sdk/bpf/c/inc/solana_sdk.h b/sdk/bpf/c/inc/solana_sdk.h index 7bae5304e7..db86969657 100644 --- a/sdk/bpf/c/inc/solana_sdk.h +++ b/sdk/bpf/c/inc/solana_sdk.h @@ -297,7 +297,7 @@ static bool sol_deserialize( uint64_t data_len = *(uint64_t *) input; input += sizeof(uint64_t); input += data_len; - input += 16 - (data_len % 16); // padding + input = (uint8_t*)(((uint64_t)input + 8 - 1) & ~(8 - 1)); // padding input += sizeof(uint64_t); } continue; @@ -334,8 +334,7 @@ static bool sol_deserialize( input += sizeof(uint64_t); params->ka[i].data = (uint8_t *) input; input += params->ka[i].data_len; - - input += 16 - (params->ka[i].data_len % 16); // padding + input = (uint8_t*)(((uint64_t)input + 8 - 1) & ~(8 - 1)); // padding // rent epoch params->ka[i].rent_epoch = *(uint64_t *) input; diff --git a/sdk/src/entrypoint.rs b/sdk/src/entrypoint.rs index 6be53a323d..2f488a3bd2 100644 --- a/sdk/src/entrypoint.rs +++ b/sdk/src/entrypoint.rs @@ -5,7 +5,7 @@ use crate::{account_info::AccountInfo, program_error::ProgramError, pubkey::Pubk use alloc::vec::Vec; use std::{ cell::RefCell, - mem::size_of, + mem::{align_of, size_of}, rc::Rc, // Hide Result from bindgen gets confused about generics in non-generic type declarations result::Result as ResultGeneric, @@ -80,7 +80,7 @@ pub unsafe fn deserialize<'a>(input: *mut u8) -> (&'a Pubkey, Vec(); - offset += 4; // padding + offset += size_of::(); // padding to u64 let key: &Pubkey = &*(input.add(offset) as *const Pubkey); offset += size_of::(); @@ -100,8 +100,7 @@ pub unsafe fn deserialize<'a>(input: *mut u8) -> (&'a Pubkey, Vec()); // padding #[allow(clippy::cast_ptr_alignment)] let rent_epoch = *(input.add(offset) as *const u64);