cleanup old features (#19956)
This commit is contained in:
@ -26,7 +26,6 @@ fn bench_verify_account_changes_data(bencher: &mut Bencher) {
|
|||||||
&post,
|
&post,
|
||||||
&mut ExecuteDetailsTimings::default(),
|
&mut ExecuteDetailsTimings::default(),
|
||||||
false,
|
false,
|
||||||
true,
|
|
||||||
),
|
),
|
||||||
Ok(())
|
Ok(())
|
||||||
);
|
);
|
||||||
@ -40,7 +39,6 @@ fn bench_verify_account_changes_data(bencher: &mut Bencher) {
|
|||||||
&post,
|
&post,
|
||||||
&mut ExecuteDetailsTimings::default(),
|
&mut ExecuteDetailsTimings::default(),
|
||||||
false,
|
false,
|
||||||
true,
|
|
||||||
)
|
)
|
||||||
.unwrap();
|
.unwrap();
|
||||||
});
|
});
|
||||||
@ -65,7 +63,6 @@ fn bench_verify_account_changes_data(bencher: &mut Bencher) {
|
|||||||
&post,
|
&post,
|
||||||
&mut ExecuteDetailsTimings::default(),
|
&mut ExecuteDetailsTimings::default(),
|
||||||
false,
|
false,
|
||||||
true,
|
|
||||||
)
|
)
|
||||||
.unwrap();
|
.unwrap();
|
||||||
});
|
});
|
||||||
|
@ -116,7 +116,6 @@ impl PreAccount {
|
|||||||
post: &AccountSharedData,
|
post: &AccountSharedData,
|
||||||
timings: &mut ExecuteDetailsTimings,
|
timings: &mut ExecuteDetailsTimings,
|
||||||
outermost_call: bool,
|
outermost_call: bool,
|
||||||
updated_verify_policy: bool,
|
|
||||||
) -> Result<(), InstructionError> {
|
) -> Result<(), InstructionError> {
|
||||||
let pre = self.account.borrow();
|
let pre = self.account.borrow();
|
||||||
|
|
||||||
@ -185,14 +184,9 @@ impl PreAccount {
|
|||||||
if !rent.is_exempt(post.lamports(), post.data().len()) {
|
if !rent.is_exempt(post.lamports(), post.data().len()) {
|
||||||
return Err(InstructionError::ExecutableAccountNotRentExempt);
|
return Err(InstructionError::ExecutableAccountNotRentExempt);
|
||||||
}
|
}
|
||||||
let owner = if updated_verify_policy {
|
|
||||||
post.owner()
|
|
||||||
} else {
|
|
||||||
pre.owner()
|
|
||||||
};
|
|
||||||
if !is_writable // line coverage used to get branch coverage
|
if !is_writable // line coverage used to get branch coverage
|
||||||
|| pre.executable()
|
|| pre.executable()
|
||||||
|| program_id != owner
|
|| program_id != post.owner()
|
||||||
{
|
{
|
||||||
return Err(InstructionError::ExecutableModified);
|
return Err(InstructionError::ExecutableModified);
|
||||||
}
|
}
|
||||||
@ -703,7 +697,6 @@ impl InstructionProcessor {
|
|||||||
write_privileges: &[bool],
|
write_privileges: &[bool],
|
||||||
timings: &mut ExecuteDetailsTimings,
|
timings: &mut ExecuteDetailsTimings,
|
||||||
logger: Rc<RefCell<dyn Logger>>,
|
logger: Rc<RefCell<dyn Logger>>,
|
||||||
updated_verify_policy: bool,
|
|
||||||
) -> Result<(), InstructionError> {
|
) -> Result<(), InstructionError> {
|
||||||
// Verify the per-account instruction results
|
// Verify the per-account instruction results
|
||||||
let (mut pre_sum, mut post_sum) = (0_u128, 0_u128);
|
let (mut pre_sum, mut post_sum) = (0_u128, 0_u128);
|
||||||
@ -722,15 +715,7 @@ impl InstructionProcessor {
|
|||||||
}
|
}
|
||||||
let account = account.borrow();
|
let account = account.borrow();
|
||||||
pre_account
|
pre_account
|
||||||
.verify(
|
.verify(program_id, is_writable, rent, &account, timings, false)
|
||||||
program_id,
|
|
||||||
is_writable,
|
|
||||||
rent,
|
|
||||||
&account,
|
|
||||||
timings,
|
|
||||||
false,
|
|
||||||
updated_verify_policy,
|
|
||||||
)
|
|
||||||
.map_err(|err| {
|
.map_err(|err| {
|
||||||
ic_logger_msg!(logger, "failed to verify account {}: {}", key, err);
|
ic_logger_msg!(logger, "failed to verify account {}: {}", key, err);
|
||||||
err
|
err
|
||||||
@ -848,7 +833,6 @@ mod tests {
|
|||||||
&self.post,
|
&self.post,
|
||||||
&mut ExecuteDetailsTimings::default(),
|
&mut ExecuteDetailsTimings::default(),
|
||||||
false,
|
false,
|
||||||
true,
|
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -23,8 +23,8 @@ use solana_sdk::{
|
|||||||
feature_set::{
|
feature_set::{
|
||||||
allow_native_ids, blake3_syscall_enabled, check_seed_length,
|
allow_native_ids, blake3_syscall_enabled, check_seed_length,
|
||||||
close_upgradeable_program_accounts, demote_program_write_locks, disable_fees_sysvar,
|
close_upgradeable_program_accounts, demote_program_write_locks, disable_fees_sysvar,
|
||||||
enforce_aligned_host_addrs, libsecp256k1_0_5_upgrade_enabled, mem_overlap_fix,
|
libsecp256k1_0_5_upgrade_enabled, mem_overlap_fix, return_data_syscall_enabled,
|
||||||
return_data_syscall_enabled, secp256k1_recover_syscall_enabled,
|
secp256k1_recover_syscall_enabled,
|
||||||
},
|
},
|
||||||
hash::{Hasher, HASH_BYTES},
|
hash::{Hasher, HASH_BYTES},
|
||||||
ic_msg,
|
ic_msg,
|
||||||
@ -208,8 +208,6 @@ pub fn bind_syscall_context_objects<'a>(
|
|||||||
heap: AlignedMemory,
|
heap: AlignedMemory,
|
||||||
) -> Result<(), EbpfError<BpfError>> {
|
) -> Result<(), EbpfError<BpfError>> {
|
||||||
let compute_budget = invoke_context.get_compute_budget();
|
let compute_budget = invoke_context.get_compute_budget();
|
||||||
let enforce_aligned_host_addrs =
|
|
||||||
invoke_context.is_feature_active(&enforce_aligned_host_addrs::id());
|
|
||||||
|
|
||||||
// Syscall functions common across languages
|
// Syscall functions common across languages
|
||||||
|
|
||||||
@ -218,7 +216,6 @@ pub fn bind_syscall_context_objects<'a>(
|
|||||||
Box::new(SyscallPanic {
|
Box::new(SyscallPanic {
|
||||||
compute_meter: invoke_context.get_compute_meter(),
|
compute_meter: invoke_context.get_compute_meter(),
|
||||||
loader_id,
|
loader_id,
|
||||||
enforce_aligned_host_addrs,
|
|
||||||
}),
|
}),
|
||||||
None,
|
None,
|
||||||
)?;
|
)?;
|
||||||
@ -227,7 +224,6 @@ pub fn bind_syscall_context_objects<'a>(
|
|||||||
compute_meter: invoke_context.get_compute_meter(),
|
compute_meter: invoke_context.get_compute_meter(),
|
||||||
logger: invoke_context.get_logger(),
|
logger: invoke_context.get_logger(),
|
||||||
loader_id,
|
loader_id,
|
||||||
enforce_aligned_host_addrs,
|
|
||||||
}),
|
}),
|
||||||
None,
|
None,
|
||||||
)?;
|
)?;
|
||||||
@ -255,7 +251,6 @@ pub fn bind_syscall_context_objects<'a>(
|
|||||||
compute_meter: invoke_context.get_compute_meter(),
|
compute_meter: invoke_context.get_compute_meter(),
|
||||||
logger: invoke_context.get_logger(),
|
logger: invoke_context.get_logger(),
|
||||||
loader_id,
|
loader_id,
|
||||||
enforce_aligned_host_addrs,
|
|
||||||
}),
|
}),
|
||||||
None,
|
None,
|
||||||
)?;
|
)?;
|
||||||
@ -267,7 +262,6 @@ pub fn bind_syscall_context_objects<'a>(
|
|||||||
cost: compute_budget.create_program_address_units,
|
cost: compute_budget.create_program_address_units,
|
||||||
compute_meter: invoke_context.get_compute_meter(),
|
compute_meter: invoke_context.get_compute_meter(),
|
||||||
loader_id,
|
loader_id,
|
||||||
enforce_aligned_host_addrs,
|
|
||||||
allow_native_ids,
|
allow_native_ids,
|
||||||
check_seed_length,
|
check_seed_length,
|
||||||
}),
|
}),
|
||||||
@ -278,7 +272,6 @@ pub fn bind_syscall_context_objects<'a>(
|
|||||||
cost: compute_budget.create_program_address_units,
|
cost: compute_budget.create_program_address_units,
|
||||||
compute_meter: invoke_context.get_compute_meter(),
|
compute_meter: invoke_context.get_compute_meter(),
|
||||||
loader_id,
|
loader_id,
|
||||||
enforce_aligned_host_addrs,
|
|
||||||
allow_native_ids,
|
allow_native_ids,
|
||||||
check_seed_length,
|
check_seed_length,
|
||||||
}),
|
}),
|
||||||
@ -291,7 +284,6 @@ pub fn bind_syscall_context_objects<'a>(
|
|||||||
sha256_byte_cost: compute_budget.sha256_byte_cost,
|
sha256_byte_cost: compute_budget.sha256_byte_cost,
|
||||||
compute_meter: invoke_context.get_compute_meter(),
|
compute_meter: invoke_context.get_compute_meter(),
|
||||||
loader_id,
|
loader_id,
|
||||||
enforce_aligned_host_addrs,
|
|
||||||
}),
|
}),
|
||||||
None,
|
None,
|
||||||
)?;
|
)?;
|
||||||
@ -461,19 +453,10 @@ fn translate_type_inner<'a, T>(
|
|||||||
access_type: AccessType,
|
access_type: AccessType,
|
||||||
vm_addr: u64,
|
vm_addr: u64,
|
||||||
loader_id: &Pubkey,
|
loader_id: &Pubkey,
|
||||||
enforce_aligned_host_addrs: bool,
|
|
||||||
) -> Result<&'a mut T, EbpfError<BpfError>> {
|
) -> Result<&'a mut T, EbpfError<BpfError>> {
|
||||||
if !enforce_aligned_host_addrs
|
|
||||||
&& loader_id != &bpf_loader_deprecated::id()
|
|
||||||
&& (vm_addr as *mut T).align_offset(align_of::<T>()) != 0
|
|
||||||
{
|
|
||||||
return Err(SyscallError::UnalignedPointer.into());
|
|
||||||
}
|
|
||||||
|
|
||||||
let host_addr = translate(memory_mapping, access_type, vm_addr, size_of::<T>() as u64)?;
|
let host_addr = translate(memory_mapping, access_type, vm_addr, size_of::<T>() as u64)?;
|
||||||
|
|
||||||
if enforce_aligned_host_addrs
|
if loader_id != &bpf_loader_deprecated::id()
|
||||||
&& loader_id != &bpf_loader_deprecated::id()
|
|
||||||
&& (host_addr as *mut T).align_offset(align_of::<T>()) != 0
|
&& (host_addr as *mut T).align_offset(align_of::<T>()) != 0
|
||||||
{
|
{
|
||||||
return Err(SyscallError::UnalignedPointer.into());
|
return Err(SyscallError::UnalignedPointer.into());
|
||||||
@ -484,30 +467,16 @@ fn translate_type_mut<'a, T>(
|
|||||||
memory_mapping: &MemoryMapping,
|
memory_mapping: &MemoryMapping,
|
||||||
vm_addr: u64,
|
vm_addr: u64,
|
||||||
loader_id: &Pubkey,
|
loader_id: &Pubkey,
|
||||||
enforce_aligned_host_addrs: bool,
|
|
||||||
) -> Result<&'a mut T, EbpfError<BpfError>> {
|
) -> Result<&'a mut T, EbpfError<BpfError>> {
|
||||||
translate_type_inner::<T>(
|
translate_type_inner::<T>(memory_mapping, AccessType::Store, vm_addr, loader_id)
|
||||||
memory_mapping,
|
|
||||||
AccessType::Store,
|
|
||||||
vm_addr,
|
|
||||||
loader_id,
|
|
||||||
enforce_aligned_host_addrs,
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
fn translate_type<'a, T>(
|
fn translate_type<'a, T>(
|
||||||
memory_mapping: &MemoryMapping,
|
memory_mapping: &MemoryMapping,
|
||||||
vm_addr: u64,
|
vm_addr: u64,
|
||||||
loader_id: &Pubkey,
|
loader_id: &Pubkey,
|
||||||
enforce_aligned_host_addrs: bool,
|
|
||||||
) -> Result<&'a T, EbpfError<BpfError>> {
|
) -> Result<&'a T, EbpfError<BpfError>> {
|
||||||
translate_type_inner::<T>(
|
translate_type_inner::<T>(memory_mapping, AccessType::Load, vm_addr, loader_id)
|
||||||
memory_mapping,
|
.map(|value| &*value)
|
||||||
AccessType::Load,
|
|
||||||
vm_addr,
|
|
||||||
loader_id,
|
|
||||||
enforce_aligned_host_addrs,
|
|
||||||
)
|
|
||||||
.map(|value| &*value)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn translate_slice_inner<'a, T>(
|
fn translate_slice_inner<'a, T>(
|
||||||
@ -516,14 +485,7 @@ fn translate_slice_inner<'a, T>(
|
|||||||
vm_addr: u64,
|
vm_addr: u64,
|
||||||
len: u64,
|
len: u64,
|
||||||
loader_id: &Pubkey,
|
loader_id: &Pubkey,
|
||||||
enforce_aligned_host_addrs: bool,
|
|
||||||
) -> Result<&'a mut [T], EbpfError<BpfError>> {
|
) -> Result<&'a mut [T], EbpfError<BpfError>> {
|
||||||
if !enforce_aligned_host_addrs
|
|
||||||
&& loader_id != &bpf_loader_deprecated::id()
|
|
||||||
&& (vm_addr as u64 as *mut T).align_offset(align_of::<T>()) != 0
|
|
||||||
{
|
|
||||||
return Err(SyscallError::UnalignedPointer.into());
|
|
||||||
}
|
|
||||||
if len == 0 {
|
if len == 0 {
|
||||||
return Ok(&mut []);
|
return Ok(&mut []);
|
||||||
}
|
}
|
||||||
@ -535,8 +497,7 @@ fn translate_slice_inner<'a, T>(
|
|||||||
len.saturating_mul(size_of::<T>() as u64),
|
len.saturating_mul(size_of::<T>() as u64),
|
||||||
)?;
|
)?;
|
||||||
|
|
||||||
if enforce_aligned_host_addrs
|
if loader_id != &bpf_loader_deprecated::id()
|
||||||
&& loader_id != &bpf_loader_deprecated::id()
|
|
||||||
&& (host_addr as *mut T).align_offset(align_of::<T>()) != 0
|
&& (host_addr as *mut T).align_offset(align_of::<T>()) != 0
|
||||||
{
|
{
|
||||||
return Err(SyscallError::UnalignedPointer.into());
|
return Err(SyscallError::UnalignedPointer.into());
|
||||||
@ -548,33 +509,17 @@ fn translate_slice_mut<'a, T>(
|
|||||||
vm_addr: u64,
|
vm_addr: u64,
|
||||||
len: u64,
|
len: u64,
|
||||||
loader_id: &Pubkey,
|
loader_id: &Pubkey,
|
||||||
enforce_aligned_host_addrs: bool,
|
|
||||||
) -> Result<&'a mut [T], EbpfError<BpfError>> {
|
) -> Result<&'a mut [T], EbpfError<BpfError>> {
|
||||||
translate_slice_inner::<T>(
|
translate_slice_inner::<T>(memory_mapping, AccessType::Store, vm_addr, len, loader_id)
|
||||||
memory_mapping,
|
|
||||||
AccessType::Store,
|
|
||||||
vm_addr,
|
|
||||||
len,
|
|
||||||
loader_id,
|
|
||||||
enforce_aligned_host_addrs,
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
fn translate_slice<'a, T>(
|
fn translate_slice<'a, T>(
|
||||||
memory_mapping: &MemoryMapping,
|
memory_mapping: &MemoryMapping,
|
||||||
vm_addr: u64,
|
vm_addr: u64,
|
||||||
len: u64,
|
len: u64,
|
||||||
loader_id: &Pubkey,
|
loader_id: &Pubkey,
|
||||||
enforce_aligned_host_addrs: bool,
|
|
||||||
) -> Result<&'a [T], EbpfError<BpfError>> {
|
) -> Result<&'a [T], EbpfError<BpfError>> {
|
||||||
translate_slice_inner::<T>(
|
translate_slice_inner::<T>(memory_mapping, AccessType::Load, vm_addr, len, loader_id)
|
||||||
memory_mapping,
|
.map(|value| &*value)
|
||||||
AccessType::Load,
|
|
||||||
vm_addr,
|
|
||||||
len,
|
|
||||||
loader_id,
|
|
||||||
enforce_aligned_host_addrs,
|
|
||||||
)
|
|
||||||
.map(|value| &*value)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Take a virtual pointer to a string (points to BPF VM memory space), translate it
|
/// Take a virtual pointer to a string (points to BPF VM memory space), translate it
|
||||||
@ -584,16 +529,9 @@ fn translate_string_and_do(
|
|||||||
addr: u64,
|
addr: u64,
|
||||||
len: u64,
|
len: u64,
|
||||||
loader_id: &Pubkey,
|
loader_id: &Pubkey,
|
||||||
enforce_aligned_host_addrs: bool,
|
|
||||||
work: &mut dyn FnMut(&str) -> Result<u64, EbpfError<BpfError>>,
|
work: &mut dyn FnMut(&str) -> Result<u64, EbpfError<BpfError>>,
|
||||||
) -> Result<u64, EbpfError<BpfError>> {
|
) -> Result<u64, EbpfError<BpfError>> {
|
||||||
let buf = translate_slice::<u8>(
|
let buf = translate_slice::<u8>(memory_mapping, addr, len, loader_id)?;
|
||||||
memory_mapping,
|
|
||||||
addr,
|
|
||||||
len,
|
|
||||||
loader_id,
|
|
||||||
enforce_aligned_host_addrs,
|
|
||||||
)?;
|
|
||||||
let i = match buf.iter().position(|byte| *byte == 0) {
|
let i = match buf.iter().position(|byte| *byte == 0) {
|
||||||
Some(i) => i,
|
Some(i) => i,
|
||||||
None => len as usize,
|
None => len as usize,
|
||||||
@ -630,7 +568,6 @@ impl SyscallObject<BpfError> for SyscallAbort {
|
|||||||
pub struct SyscallPanic<'a> {
|
pub struct SyscallPanic<'a> {
|
||||||
compute_meter: Rc<RefCell<dyn ComputeMeter>>,
|
compute_meter: Rc<RefCell<dyn ComputeMeter>>,
|
||||||
loader_id: &'a Pubkey,
|
loader_id: &'a Pubkey,
|
||||||
enforce_aligned_host_addrs: bool,
|
|
||||||
}
|
}
|
||||||
impl<'a> SyscallObject<BpfError> for SyscallPanic<'a> {
|
impl<'a> SyscallObject<BpfError> for SyscallPanic<'a> {
|
||||||
fn call(
|
fn call(
|
||||||
@ -649,7 +586,6 @@ impl<'a> SyscallObject<BpfError> for SyscallPanic<'a> {
|
|||||||
file,
|
file,
|
||||||
len,
|
len,
|
||||||
self.loader_id,
|
self.loader_id,
|
||||||
self.enforce_aligned_host_addrs,
|
|
||||||
&mut |string: &str| Err(SyscallError::Panic(string.to_string(), line, column).into()),
|
&mut |string: &str| Err(SyscallError::Panic(string.to_string(), line, column).into()),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@ -660,7 +596,6 @@ pub struct SyscallLog<'a> {
|
|||||||
compute_meter: Rc<RefCell<dyn ComputeMeter>>,
|
compute_meter: Rc<RefCell<dyn ComputeMeter>>,
|
||||||
logger: Rc<RefCell<dyn Logger>>,
|
logger: Rc<RefCell<dyn Logger>>,
|
||||||
loader_id: &'a Pubkey,
|
loader_id: &'a Pubkey,
|
||||||
enforce_aligned_host_addrs: bool,
|
|
||||||
}
|
}
|
||||||
impl<'a> SyscallObject<BpfError> for SyscallLog<'a> {
|
impl<'a> SyscallObject<BpfError> for SyscallLog<'a> {
|
||||||
fn call(
|
fn call(
|
||||||
@ -680,7 +615,6 @@ impl<'a> SyscallObject<BpfError> for SyscallLog<'a> {
|
|||||||
addr,
|
addr,
|
||||||
len,
|
len,
|
||||||
self.loader_id,
|
self.loader_id,
|
||||||
self.enforce_aligned_host_addrs,
|
|
||||||
&mut |string: &str| {
|
&mut |string: &str| {
|
||||||
stable_log::program_log(&self.logger, string);
|
stable_log::program_log(&self.logger, string);
|
||||||
Ok(0)
|
Ok(0)
|
||||||
@ -761,7 +695,6 @@ pub struct SyscallLogPubkey<'a> {
|
|||||||
compute_meter: Rc<RefCell<dyn ComputeMeter>>,
|
compute_meter: Rc<RefCell<dyn ComputeMeter>>,
|
||||||
logger: Rc<RefCell<dyn Logger>>,
|
logger: Rc<RefCell<dyn Logger>>,
|
||||||
loader_id: &'a Pubkey,
|
loader_id: &'a Pubkey,
|
||||||
enforce_aligned_host_addrs: bool,
|
|
||||||
}
|
}
|
||||||
impl<'a> SyscallObject<BpfError> for SyscallLogPubkey<'a> {
|
impl<'a> SyscallObject<BpfError> for SyscallLogPubkey<'a> {
|
||||||
fn call(
|
fn call(
|
||||||
@ -776,12 +709,7 @@ impl<'a> SyscallObject<BpfError> for SyscallLogPubkey<'a> {
|
|||||||
) {
|
) {
|
||||||
question_mark!(self.compute_meter.consume(self.cost), result);
|
question_mark!(self.compute_meter.consume(self.cost), result);
|
||||||
let pubkey = question_mark!(
|
let pubkey = question_mark!(
|
||||||
translate_type::<Pubkey>(
|
translate_type::<Pubkey>(memory_mapping, pubkey_addr, self.loader_id,),
|
||||||
memory_mapping,
|
|
||||||
pubkey_addr,
|
|
||||||
self.loader_id,
|
|
||||||
self.enforce_aligned_host_addrs,
|
|
||||||
),
|
|
||||||
result
|
result
|
||||||
);
|
);
|
||||||
stable_log::program_log(&self.logger, &pubkey.to_string());
|
stable_log::program_log(&self.logger, &pubkey.to_string());
|
||||||
@ -840,16 +768,10 @@ fn translate_and_check_program_address_inputs<'a>(
|
|||||||
program_id_addr: u64,
|
program_id_addr: u64,
|
||||||
memory_mapping: &MemoryMapping,
|
memory_mapping: &MemoryMapping,
|
||||||
loader_id: &Pubkey,
|
loader_id: &Pubkey,
|
||||||
enforce_aligned_host_addrs: bool,
|
|
||||||
check_seed_length: bool,
|
check_seed_length: bool,
|
||||||
) -> Result<(Vec<&'a [u8]>, &'a Pubkey), EbpfError<BpfError>> {
|
) -> Result<(Vec<&'a [u8]>, &'a Pubkey), EbpfError<BpfError>> {
|
||||||
let untranslated_seeds = translate_slice::<&[&u8]>(
|
let untranslated_seeds =
|
||||||
memory_mapping,
|
translate_slice::<&[&u8]>(memory_mapping, seeds_addr, seeds_len, loader_id)?;
|
||||||
seeds_addr,
|
|
||||||
seeds_len,
|
|
||||||
loader_id,
|
|
||||||
enforce_aligned_host_addrs,
|
|
||||||
)?;
|
|
||||||
if untranslated_seeds.len() > MAX_SEEDS {
|
if untranslated_seeds.len() > MAX_SEEDS {
|
||||||
return Err(SyscallError::BadSeeds(PubkeyError::MaxSeedLengthExceeded).into());
|
return Err(SyscallError::BadSeeds(PubkeyError::MaxSeedLengthExceeded).into());
|
||||||
}
|
}
|
||||||
@ -864,16 +786,10 @@ fn translate_and_check_program_address_inputs<'a>(
|
|||||||
untranslated_seed.as_ptr() as *const _ as u64,
|
untranslated_seed.as_ptr() as *const _ as u64,
|
||||||
untranslated_seed.len() as u64,
|
untranslated_seed.len() as u64,
|
||||||
loader_id,
|
loader_id,
|
||||||
enforce_aligned_host_addrs,
|
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
.collect::<Result<Vec<_>, EbpfError<BpfError>>>()?;
|
.collect::<Result<Vec<_>, EbpfError<BpfError>>>()?;
|
||||||
let program_id = translate_type::<Pubkey>(
|
let program_id = translate_type::<Pubkey>(memory_mapping, program_id_addr, loader_id)?;
|
||||||
memory_mapping,
|
|
||||||
program_id_addr,
|
|
||||||
loader_id,
|
|
||||||
enforce_aligned_host_addrs,
|
|
||||||
)?;
|
|
||||||
Ok((seeds, program_id))
|
Ok((seeds, program_id))
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -911,7 +827,6 @@ struct SyscallCreateProgramAddress<'a> {
|
|||||||
cost: u64,
|
cost: u64,
|
||||||
compute_meter: Rc<RefCell<dyn ComputeMeter>>,
|
compute_meter: Rc<RefCell<dyn ComputeMeter>>,
|
||||||
loader_id: &'a Pubkey,
|
loader_id: &'a Pubkey,
|
||||||
enforce_aligned_host_addrs: bool,
|
|
||||||
allow_native_ids: bool,
|
allow_native_ids: bool,
|
||||||
check_seed_length: bool,
|
check_seed_length: bool,
|
||||||
}
|
}
|
||||||
@ -937,7 +852,6 @@ impl<'a> SyscallObject<BpfError> for SyscallCreateProgramAddress<'a> {
|
|||||||
program_id_addr,
|
program_id_addr,
|
||||||
memory_mapping,
|
memory_mapping,
|
||||||
self.loader_id,
|
self.loader_id,
|
||||||
self.enforce_aligned_host_addrs,
|
|
||||||
self.check_seed_length,
|
self.check_seed_length,
|
||||||
),
|
),
|
||||||
result
|
result
|
||||||
@ -960,13 +874,7 @@ impl<'a> SyscallObject<BpfError> for SyscallCreateProgramAddress<'a> {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
let address = question_mark!(
|
let address = question_mark!(
|
||||||
translate_slice_mut::<u8>(
|
translate_slice_mut::<u8>(memory_mapping, address_addr, 32, self.loader_id,),
|
||||||
memory_mapping,
|
|
||||||
address_addr,
|
|
||||||
32,
|
|
||||||
self.loader_id,
|
|
||||||
self.enforce_aligned_host_addrs,
|
|
||||||
),
|
|
||||||
result
|
result
|
||||||
);
|
);
|
||||||
address.copy_from_slice(new_address.as_ref());
|
address.copy_from_slice(new_address.as_ref());
|
||||||
@ -979,7 +887,6 @@ struct SyscallTryFindProgramAddress<'a> {
|
|||||||
cost: u64,
|
cost: u64,
|
||||||
compute_meter: Rc<RefCell<dyn ComputeMeter>>,
|
compute_meter: Rc<RefCell<dyn ComputeMeter>>,
|
||||||
loader_id: &'a Pubkey,
|
loader_id: &'a Pubkey,
|
||||||
enforce_aligned_host_addrs: bool,
|
|
||||||
allow_native_ids: bool,
|
allow_native_ids: bool,
|
||||||
check_seed_length: bool,
|
check_seed_length: bool,
|
||||||
}
|
}
|
||||||
@ -1005,7 +912,6 @@ impl<'a> SyscallObject<BpfError> for SyscallTryFindProgramAddress<'a> {
|
|||||||
program_id_addr,
|
program_id_addr,
|
||||||
memory_mapping,
|
memory_mapping,
|
||||||
self.loader_id,
|
self.loader_id,
|
||||||
self.enforce_aligned_host_addrs,
|
|
||||||
self.check_seed_length,
|
self.check_seed_length,
|
||||||
),
|
),
|
||||||
result
|
result
|
||||||
@ -1030,7 +936,6 @@ impl<'a> SyscallObject<BpfError> for SyscallTryFindProgramAddress<'a> {
|
|||||||
memory_mapping,
|
memory_mapping,
|
||||||
bump_seed_addr,
|
bump_seed_addr,
|
||||||
self.loader_id,
|
self.loader_id,
|
||||||
self.enforce_aligned_host_addrs,
|
|
||||||
),
|
),
|
||||||
result
|
result
|
||||||
);
|
);
|
||||||
@ -1040,7 +945,6 @@ impl<'a> SyscallObject<BpfError> for SyscallTryFindProgramAddress<'a> {
|
|||||||
address_addr,
|
address_addr,
|
||||||
32,
|
32,
|
||||||
self.loader_id,
|
self.loader_id,
|
||||||
self.enforce_aligned_host_addrs,
|
|
||||||
),
|
),
|
||||||
result
|
result
|
||||||
);
|
);
|
||||||
@ -1066,7 +970,6 @@ pub struct SyscallSha256<'a> {
|
|||||||
sha256_byte_cost: u64,
|
sha256_byte_cost: u64,
|
||||||
compute_meter: Rc<RefCell<dyn ComputeMeter>>,
|
compute_meter: Rc<RefCell<dyn ComputeMeter>>,
|
||||||
loader_id: &'a Pubkey,
|
loader_id: &'a Pubkey,
|
||||||
enforce_aligned_host_addrs: bool,
|
|
||||||
}
|
}
|
||||||
impl<'a> SyscallObject<BpfError> for SyscallSha256<'a> {
|
impl<'a> SyscallObject<BpfError> for SyscallSha256<'a> {
|
||||||
fn call(
|
fn call(
|
||||||
@ -1086,20 +989,13 @@ impl<'a> SyscallObject<BpfError> for SyscallSha256<'a> {
|
|||||||
result_addr,
|
result_addr,
|
||||||
HASH_BYTES as u64,
|
HASH_BYTES as u64,
|
||||||
self.loader_id,
|
self.loader_id,
|
||||||
self.enforce_aligned_host_addrs,
|
|
||||||
),
|
),
|
||||||
result
|
result
|
||||||
);
|
);
|
||||||
let mut hasher = Hasher::default();
|
let mut hasher = Hasher::default();
|
||||||
if vals_len > 0 {
|
if vals_len > 0 {
|
||||||
let vals = question_mark!(
|
let vals = question_mark!(
|
||||||
translate_slice::<&[u8]>(
|
translate_slice::<&[u8]>(memory_mapping, vals_addr, vals_len, self.loader_id,),
|
||||||
memory_mapping,
|
|
||||||
vals_addr,
|
|
||||||
vals_len,
|
|
||||||
self.loader_id,
|
|
||||||
self.enforce_aligned_host_addrs,
|
|
||||||
),
|
|
||||||
result
|
result
|
||||||
);
|
);
|
||||||
for val in vals.iter() {
|
for val in vals.iter() {
|
||||||
@ -1109,7 +1005,6 @@ impl<'a> SyscallObject<BpfError> for SyscallSha256<'a> {
|
|||||||
val.as_ptr() as u64,
|
val.as_ptr() as u64,
|
||||||
val.len() as u64,
|
val.len() as u64,
|
||||||
self.loader_id,
|
self.loader_id,
|
||||||
self.enforce_aligned_host_addrs,
|
|
||||||
),
|
),
|
||||||
result
|
result
|
||||||
);
|
);
|
||||||
@ -1140,12 +1035,7 @@ fn get_sysvar<T: std::fmt::Debug + Sysvar + SysvarId>(
|
|||||||
invoke_context
|
invoke_context
|
||||||
.get_compute_meter()
|
.get_compute_meter()
|
||||||
.consume(invoke_context.get_compute_budget().sysvar_base_cost + size_of::<T>() as u64)?;
|
.consume(invoke_context.get_compute_budget().sysvar_base_cost + size_of::<T>() as u64)?;
|
||||||
let var = translate_type_mut::<T>(
|
let var = translate_type_mut::<T>(memory_mapping, var_addr, loader_id)?;
|
||||||
memory_mapping,
|
|
||||||
var_addr,
|
|
||||||
loader_id,
|
|
||||||
invoke_context.is_feature_active(&enforce_aligned_host_addrs::id()),
|
|
||||||
)?;
|
|
||||||
|
|
||||||
*var = process_instruction::get_sysvar::<T>(*invoke_context, id)
|
*var = process_instruction::get_sysvar::<T>(*invoke_context, id)
|
||||||
.map_err(SyscallError::InstructionError)?;
|
.map_err(SyscallError::InstructionError)?;
|
||||||
@ -1280,14 +1170,13 @@ impl<'a> SyscallObject<BpfError> for SyscallKeccak256<'a> {
|
|||||||
result_addr,
|
result_addr,
|
||||||
keccak::HASH_BYTES as u64,
|
keccak::HASH_BYTES as u64,
|
||||||
self.loader_id,
|
self.loader_id,
|
||||||
true,
|
|
||||||
),
|
),
|
||||||
result
|
result
|
||||||
);
|
);
|
||||||
let mut hasher = keccak::Hasher::default();
|
let mut hasher = keccak::Hasher::default();
|
||||||
if vals_len > 0 {
|
if vals_len > 0 {
|
||||||
let vals = question_mark!(
|
let vals = question_mark!(
|
||||||
translate_slice::<&[u8]>(memory_mapping, vals_addr, vals_len, self.loader_id, true),
|
translate_slice::<&[u8]>(memory_mapping, vals_addr, vals_len, self.loader_id),
|
||||||
result
|
result
|
||||||
);
|
);
|
||||||
for val in vals.iter() {
|
for val in vals.iter() {
|
||||||
@ -1297,7 +1186,6 @@ impl<'a> SyscallObject<BpfError> for SyscallKeccak256<'a> {
|
|||||||
val.as_ptr() as u64,
|
val.as_ptr() as u64,
|
||||||
val.len() as u64,
|
val.len() as u64,
|
||||||
self.loader_id,
|
self.loader_id,
|
||||||
true,
|
|
||||||
),
|
),
|
||||||
result
|
result
|
||||||
);
|
);
|
||||||
@ -1348,11 +1236,11 @@ impl<'a> SyscallObject<BpfError> for SyscallMemcpy<'a> {
|
|||||||
|
|
||||||
question_mark!(self.compute_meter.consume(n / self.cost), result);
|
question_mark!(self.compute_meter.consume(n / self.cost), result);
|
||||||
let dst = question_mark!(
|
let dst = question_mark!(
|
||||||
translate_slice_mut::<u8>(memory_mapping, dst_addr, n, self.loader_id, true),
|
translate_slice_mut::<u8>(memory_mapping, dst_addr, n, self.loader_id),
|
||||||
result
|
result
|
||||||
);
|
);
|
||||||
let src = question_mark!(
|
let src = question_mark!(
|
||||||
translate_slice::<u8>(memory_mapping, src_addr, n, self.loader_id, true),
|
translate_slice::<u8>(memory_mapping, src_addr, n, self.loader_id),
|
||||||
result
|
result
|
||||||
);
|
);
|
||||||
unsafe {
|
unsafe {
|
||||||
@ -1380,11 +1268,11 @@ impl<'a> SyscallObject<BpfError> for SyscallMemmove<'a> {
|
|||||||
) {
|
) {
|
||||||
question_mark!(self.compute_meter.consume(n / self.cost), result);
|
question_mark!(self.compute_meter.consume(n / self.cost), result);
|
||||||
let dst = question_mark!(
|
let dst = question_mark!(
|
||||||
translate_slice_mut::<u8>(memory_mapping, dst_addr, n, self.loader_id, true),
|
translate_slice_mut::<u8>(memory_mapping, dst_addr, n, self.loader_id),
|
||||||
result
|
result
|
||||||
);
|
);
|
||||||
let src = question_mark!(
|
let src = question_mark!(
|
||||||
translate_slice::<u8>(memory_mapping, src_addr, n, self.loader_id, true),
|
translate_slice::<u8>(memory_mapping, src_addr, n, self.loader_id),
|
||||||
result
|
result
|
||||||
);
|
);
|
||||||
unsafe {
|
unsafe {
|
||||||
@ -1412,15 +1300,15 @@ impl<'a> SyscallObject<BpfError> for SyscallMemcmp<'a> {
|
|||||||
) {
|
) {
|
||||||
question_mark!(self.compute_meter.consume(n / self.cost), result);
|
question_mark!(self.compute_meter.consume(n / self.cost), result);
|
||||||
let s1 = question_mark!(
|
let s1 = question_mark!(
|
||||||
translate_slice::<u8>(memory_mapping, s1_addr, n, self.loader_id, true),
|
translate_slice::<u8>(memory_mapping, s1_addr, n, self.loader_id),
|
||||||
result
|
result
|
||||||
);
|
);
|
||||||
let s2 = question_mark!(
|
let s2 = question_mark!(
|
||||||
translate_slice::<u8>(memory_mapping, s2_addr, n, self.loader_id, true),
|
translate_slice::<u8>(memory_mapping, s2_addr, n, self.loader_id),
|
||||||
result
|
result
|
||||||
);
|
);
|
||||||
let cmp_result = question_mark!(
|
let cmp_result = question_mark!(
|
||||||
translate_type_mut::<i32>(memory_mapping, cmp_result_addr, self.loader_id, true),
|
translate_type_mut::<i32>(memory_mapping, cmp_result_addr, self.loader_id),
|
||||||
result
|
result
|
||||||
);
|
);
|
||||||
let mut i = 0;
|
let mut i = 0;
|
||||||
@ -1457,7 +1345,7 @@ impl<'a> SyscallObject<BpfError> for SyscallMemset<'a> {
|
|||||||
) {
|
) {
|
||||||
question_mark!(self.compute_meter.consume(n / self.cost), result);
|
question_mark!(self.compute_meter.consume(n / self.cost), result);
|
||||||
let s = question_mark!(
|
let s = question_mark!(
|
||||||
translate_slice_mut::<u8>(memory_mapping, s_addr, n, self.loader_id, true),
|
translate_slice_mut::<u8>(memory_mapping, s_addr, n, self.loader_id),
|
||||||
result
|
result
|
||||||
);
|
);
|
||||||
for val in s.iter_mut().take(n as usize) {
|
for val in s.iter_mut().take(n as usize) {
|
||||||
@ -1494,7 +1382,6 @@ impl<'a> SyscallObject<BpfError> for SyscallSecp256k1Recover<'a> {
|
|||||||
hash_addr,
|
hash_addr,
|
||||||
keccak::HASH_BYTES as u64,
|
keccak::HASH_BYTES as u64,
|
||||||
self.loader_id,
|
self.loader_id,
|
||||||
true,
|
|
||||||
),
|
),
|
||||||
result
|
result
|
||||||
);
|
);
|
||||||
@ -1504,7 +1391,6 @@ impl<'a> SyscallObject<BpfError> for SyscallSecp256k1Recover<'a> {
|
|||||||
signature_addr,
|
signature_addr,
|
||||||
SECP256K1_SIGNATURE_LENGTH as u64,
|
SECP256K1_SIGNATURE_LENGTH as u64,
|
||||||
self.loader_id,
|
self.loader_id,
|
||||||
true,
|
|
||||||
),
|
),
|
||||||
result
|
result
|
||||||
);
|
);
|
||||||
@ -1514,7 +1400,6 @@ impl<'a> SyscallObject<BpfError> for SyscallSecp256k1Recover<'a> {
|
|||||||
result_addr,
|
result_addr,
|
||||||
SECP256K1_PUBLIC_KEY_LENGTH as u64,
|
SECP256K1_PUBLIC_KEY_LENGTH as u64,
|
||||||
self.loader_id,
|
self.loader_id,
|
||||||
true,
|
|
||||||
),
|
),
|
||||||
result
|
result
|
||||||
);
|
);
|
||||||
@ -1585,14 +1470,13 @@ impl<'a> SyscallObject<BpfError> for SyscallBlake3<'a> {
|
|||||||
result_addr,
|
result_addr,
|
||||||
blake3::HASH_BYTES as u64,
|
blake3::HASH_BYTES as u64,
|
||||||
self.loader_id,
|
self.loader_id,
|
||||||
true,
|
|
||||||
),
|
),
|
||||||
result
|
result
|
||||||
);
|
);
|
||||||
let mut hasher = blake3::Hasher::default();
|
let mut hasher = blake3::Hasher::default();
|
||||||
if vals_len > 0 {
|
if vals_len > 0 {
|
||||||
let vals = question_mark!(
|
let vals = question_mark!(
|
||||||
translate_slice::<&[u8]>(memory_mapping, vals_addr, vals_len, self.loader_id, true),
|
translate_slice::<&[u8]>(memory_mapping, vals_addr, vals_len, self.loader_id),
|
||||||
result
|
result
|
||||||
);
|
);
|
||||||
for val in vals.iter() {
|
for val in vals.iter() {
|
||||||
@ -1602,7 +1486,6 @@ impl<'a> SyscallObject<BpfError> for SyscallBlake3<'a> {
|
|||||||
val.as_ptr() as u64,
|
val.as_ptr() as u64,
|
||||||
val.len() as u64,
|
val.len() as u64,
|
||||||
self.loader_id,
|
self.loader_id,
|
||||||
true,
|
|
||||||
),
|
),
|
||||||
result
|
result
|
||||||
);
|
);
|
||||||
@ -1646,7 +1529,6 @@ trait SyscallInvokeSigned<'a> {
|
|||||||
&self,
|
&self,
|
||||||
addr: u64,
|
addr: u64,
|
||||||
memory_mapping: &MemoryMapping,
|
memory_mapping: &MemoryMapping,
|
||||||
enforce_aligned_host_addrs: bool,
|
|
||||||
) -> Result<Instruction, EbpfError<BpfError>>;
|
) -> Result<Instruction, EbpfError<BpfError>>;
|
||||||
fn translate_accounts(
|
fn translate_accounts(
|
||||||
&self,
|
&self,
|
||||||
@ -1662,7 +1544,6 @@ trait SyscallInvokeSigned<'a> {
|
|||||||
signers_seeds_addr: u64,
|
signers_seeds_addr: u64,
|
||||||
signers_seeds_len: u64,
|
signers_seeds_len: u64,
|
||||||
memory_mapping: &MemoryMapping,
|
memory_mapping: &MemoryMapping,
|
||||||
enforce_aligned_host_addrs: bool,
|
|
||||||
) -> Result<Vec<Pubkey>, EbpfError<BpfError>>;
|
) -> Result<Vec<Pubkey>, EbpfError<BpfError>>;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1686,14 +1567,8 @@ impl<'a> SyscallInvokeSigned<'a> for SyscallInvokeSignedRust<'a> {
|
|||||||
&self,
|
&self,
|
||||||
addr: u64,
|
addr: u64,
|
||||||
memory_mapping: &MemoryMapping,
|
memory_mapping: &MemoryMapping,
|
||||||
enforce_aligned_host_addrs: bool,
|
|
||||||
) -> Result<Instruction, EbpfError<BpfError>> {
|
) -> Result<Instruction, EbpfError<BpfError>> {
|
||||||
let ix = translate_type::<Instruction>(
|
let ix = translate_type::<Instruction>(memory_mapping, addr, self.loader_id)?;
|
||||||
memory_mapping,
|
|
||||||
addr,
|
|
||||||
self.loader_id,
|
|
||||||
enforce_aligned_host_addrs,
|
|
||||||
)?;
|
|
||||||
|
|
||||||
check_instruction_size(
|
check_instruction_size(
|
||||||
ix.accounts.len(),
|
ix.accounts.len(),
|
||||||
@ -1706,7 +1581,6 @@ impl<'a> SyscallInvokeSigned<'a> for SyscallInvokeSignedRust<'a> {
|
|||||||
ix.accounts.as_ptr() as u64,
|
ix.accounts.as_ptr() as u64,
|
||||||
ix.accounts.len() as u64,
|
ix.accounts.len() as u64,
|
||||||
self.loader_id,
|
self.loader_id,
|
||||||
enforce_aligned_host_addrs,
|
|
||||||
)?
|
)?
|
||||||
.to_vec();
|
.to_vec();
|
||||||
let data = translate_slice::<u8>(
|
let data = translate_slice::<u8>(
|
||||||
@ -1714,7 +1588,6 @@ impl<'a> SyscallInvokeSigned<'a> for SyscallInvokeSignedRust<'a> {
|
|||||||
ix.data.as_ptr() as u64,
|
ix.data.as_ptr() as u64,
|
||||||
ix.data.len() as u64,
|
ix.data.len() as u64,
|
||||||
self.loader_id,
|
self.loader_id,
|
||||||
enforce_aligned_host_addrs,
|
|
||||||
)?
|
)?
|
||||||
.to_vec();
|
.to_vec();
|
||||||
Ok(Instruction {
|
Ok(Instruction {
|
||||||
@ -1733,15 +1606,12 @@ impl<'a> SyscallInvokeSigned<'a> for SyscallInvokeSignedRust<'a> {
|
|||||||
memory_mapping: &MemoryMapping,
|
memory_mapping: &MemoryMapping,
|
||||||
) -> Result<TranslatedAccounts<'a>, EbpfError<BpfError>> {
|
) -> Result<TranslatedAccounts<'a>, EbpfError<BpfError>> {
|
||||||
let invoke_context = self.invoke_context.borrow();
|
let invoke_context = self.invoke_context.borrow();
|
||||||
let enforce_aligned_host_addrs =
|
|
||||||
invoke_context.is_feature_active(&enforce_aligned_host_addrs::id());
|
|
||||||
|
|
||||||
let account_infos = translate_slice::<AccountInfo>(
|
let account_infos = translate_slice::<AccountInfo>(
|
||||||
memory_mapping,
|
memory_mapping,
|
||||||
account_infos_addr,
|
account_infos_addr,
|
||||||
account_infos_len,
|
account_infos_len,
|
||||||
self.loader_id,
|
self.loader_id,
|
||||||
enforce_aligned_host_addrs,
|
|
||||||
)?;
|
)?;
|
||||||
check_account_infos(account_infos.len(), &invoke_context)?;
|
check_account_infos(account_infos.len(), &invoke_context)?;
|
||||||
let account_info_keys = account_infos
|
let account_info_keys = account_infos
|
||||||
@ -1751,7 +1621,6 @@ impl<'a> SyscallInvokeSigned<'a> for SyscallInvokeSignedRust<'a> {
|
|||||||
memory_mapping,
|
memory_mapping,
|
||||||
account_info.key as *const _ as u64,
|
account_info.key as *const _ as u64,
|
||||||
self.loader_id,
|
self.loader_id,
|
||||||
enforce_aligned_host_addrs,
|
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
.collect::<Result<Vec<_>, EbpfError<BpfError>>>()?;
|
.collect::<Result<Vec<_>, EbpfError<BpfError>>>()?;
|
||||||
@ -1766,20 +1635,13 @@ impl<'a> SyscallInvokeSigned<'a> for SyscallInvokeSignedRust<'a> {
|
|||||||
memory_mapping,
|
memory_mapping,
|
||||||
account_info.lamports.as_ptr() as u64,
|
account_info.lamports.as_ptr() as u64,
|
||||||
self.loader_id,
|
self.loader_id,
|
||||||
enforce_aligned_host_addrs,
|
|
||||||
)?;
|
)?;
|
||||||
translate_type_mut::<u64>(
|
translate_type_mut::<u64>(memory_mapping, *ptr, self.loader_id)?
|
||||||
memory_mapping,
|
|
||||||
*ptr,
|
|
||||||
self.loader_id,
|
|
||||||
enforce_aligned_host_addrs,
|
|
||||||
)?
|
|
||||||
};
|
};
|
||||||
let owner = translate_type_mut::<Pubkey>(
|
let owner = translate_type_mut::<Pubkey>(
|
||||||
memory_mapping,
|
memory_mapping,
|
||||||
account_info.owner as *const _ as u64,
|
account_info.owner as *const _ as u64,
|
||||||
self.loader_id,
|
self.loader_id,
|
||||||
enforce_aligned_host_addrs,
|
|
||||||
)?;
|
)?;
|
||||||
|
|
||||||
let (data, vm_data_addr, ref_to_len_in_vm, serialized_len_ptr) = {
|
let (data, vm_data_addr, ref_to_len_in_vm, serialized_len_ptr) = {
|
||||||
@ -1788,7 +1650,6 @@ impl<'a> SyscallInvokeSigned<'a> for SyscallInvokeSignedRust<'a> {
|
|||||||
memory_mapping,
|
memory_mapping,
|
||||||
account_info.data.as_ptr() as *const _ as u64,
|
account_info.data.as_ptr() as *const _ as u64,
|
||||||
self.loader_id,
|
self.loader_id,
|
||||||
enforce_aligned_host_addrs,
|
|
||||||
)?;
|
)?;
|
||||||
|
|
||||||
invoke_context.get_compute_meter().consume(
|
invoke_context.get_compute_meter().consume(
|
||||||
@ -1807,7 +1668,6 @@ impl<'a> SyscallInvokeSigned<'a> for SyscallInvokeSignedRust<'a> {
|
|||||||
memory_mapping,
|
memory_mapping,
|
||||||
ref_of_len_in_input_buffer as *const _ as u64,
|
ref_of_len_in_input_buffer as *const _ as u64,
|
||||||
self.loader_id,
|
self.loader_id,
|
||||||
enforce_aligned_host_addrs,
|
|
||||||
)?;
|
)?;
|
||||||
let vm_data_addr = data.as_ptr() as u64;
|
let vm_data_addr = data.as_ptr() as u64;
|
||||||
(
|
(
|
||||||
@ -1816,7 +1676,6 @@ impl<'a> SyscallInvokeSigned<'a> for SyscallInvokeSignedRust<'a> {
|
|||||||
vm_data_addr,
|
vm_data_addr,
|
||||||
data.len() as u64,
|
data.len() as u64,
|
||||||
self.loader_id,
|
self.loader_id,
|
||||||
enforce_aligned_host_addrs,
|
|
||||||
)?,
|
)?,
|
||||||
vm_data_addr,
|
vm_data_addr,
|
||||||
ref_to_len_in_vm,
|
ref_to_len_in_vm,
|
||||||
@ -1859,7 +1718,6 @@ impl<'a> SyscallInvokeSigned<'a> for SyscallInvokeSignedRust<'a> {
|
|||||||
signers_seeds_addr: u64,
|
signers_seeds_addr: u64,
|
||||||
signers_seeds_len: u64,
|
signers_seeds_len: u64,
|
||||||
memory_mapping: &MemoryMapping,
|
memory_mapping: &MemoryMapping,
|
||||||
enforce_aligned_host_addrs: bool,
|
|
||||||
) -> Result<Vec<Pubkey>, EbpfError<BpfError>> {
|
) -> Result<Vec<Pubkey>, EbpfError<BpfError>> {
|
||||||
let mut signers = Vec::new();
|
let mut signers = Vec::new();
|
||||||
if signers_seeds_len > 0 {
|
if signers_seeds_len > 0 {
|
||||||
@ -1868,7 +1726,6 @@ impl<'a> SyscallInvokeSigned<'a> for SyscallInvokeSignedRust<'a> {
|
|||||||
signers_seeds_addr,
|
signers_seeds_addr,
|
||||||
signers_seeds_len,
|
signers_seeds_len,
|
||||||
self.loader_id,
|
self.loader_id,
|
||||||
enforce_aligned_host_addrs,
|
|
||||||
)?;
|
)?;
|
||||||
if signers_seeds.len() > MAX_SIGNERS {
|
if signers_seeds.len() > MAX_SIGNERS {
|
||||||
return Err(SyscallError::TooManySigners.into());
|
return Err(SyscallError::TooManySigners.into());
|
||||||
@ -1879,7 +1736,6 @@ impl<'a> SyscallInvokeSigned<'a> for SyscallInvokeSignedRust<'a> {
|
|||||||
signer_seeds.as_ptr() as *const _ as u64,
|
signer_seeds.as_ptr() as *const _ as u64,
|
||||||
signer_seeds.len() as u64,
|
signer_seeds.len() as u64,
|
||||||
self.loader_id,
|
self.loader_id,
|
||||||
enforce_aligned_host_addrs,
|
|
||||||
)?;
|
)?;
|
||||||
if untranslated_seeds.len() > MAX_SEEDS {
|
if untranslated_seeds.len() > MAX_SEEDS {
|
||||||
return Err(SyscallError::InstructionError(
|
return Err(SyscallError::InstructionError(
|
||||||
@ -1895,7 +1751,6 @@ impl<'a> SyscallInvokeSigned<'a> for SyscallInvokeSignedRust<'a> {
|
|||||||
untranslated_seed.as_ptr() as *const _ as u64,
|
untranslated_seed.as_ptr() as *const _ as u64,
|
||||||
untranslated_seed.len() as u64,
|
untranslated_seed.len() as u64,
|
||||||
self.loader_id,
|
self.loader_id,
|
||||||
enforce_aligned_host_addrs,
|
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
.collect::<Result<Vec<_>, EbpfError<BpfError>>>()?;
|
.collect::<Result<Vec<_>, EbpfError<BpfError>>>()?;
|
||||||
@ -1999,50 +1854,34 @@ impl<'a> SyscallInvokeSigned<'a> for SyscallInvokeSignedC<'a> {
|
|||||||
&self,
|
&self,
|
||||||
addr: u64,
|
addr: u64,
|
||||||
memory_mapping: &MemoryMapping,
|
memory_mapping: &MemoryMapping,
|
||||||
enforce_aligned_host_addrs: bool,
|
|
||||||
) -> Result<Instruction, EbpfError<BpfError>> {
|
) -> Result<Instruction, EbpfError<BpfError>> {
|
||||||
let ix_c = translate_type::<SolInstruction>(
|
let ix_c = translate_type::<SolInstruction>(memory_mapping, addr, self.loader_id)?;
|
||||||
memory_mapping,
|
|
||||||
addr,
|
|
||||||
self.loader_id,
|
|
||||||
enforce_aligned_host_addrs,
|
|
||||||
)?;
|
|
||||||
|
|
||||||
check_instruction_size(
|
check_instruction_size(
|
||||||
ix_c.accounts_len,
|
ix_c.accounts_len,
|
||||||
ix_c.data_len,
|
ix_c.data_len,
|
||||||
&self.invoke_context.borrow(),
|
&self.invoke_context.borrow(),
|
||||||
)?;
|
)?;
|
||||||
let program_id = translate_type::<Pubkey>(
|
let program_id =
|
||||||
memory_mapping,
|
translate_type::<Pubkey>(memory_mapping, ix_c.program_id_addr, self.loader_id)?;
|
||||||
ix_c.program_id_addr,
|
|
||||||
self.loader_id,
|
|
||||||
enforce_aligned_host_addrs,
|
|
||||||
)?;
|
|
||||||
let meta_cs = translate_slice::<SolAccountMeta>(
|
let meta_cs = translate_slice::<SolAccountMeta>(
|
||||||
memory_mapping,
|
memory_mapping,
|
||||||
ix_c.accounts_addr,
|
ix_c.accounts_addr,
|
||||||
ix_c.accounts_len as u64,
|
ix_c.accounts_len as u64,
|
||||||
self.loader_id,
|
self.loader_id,
|
||||||
enforce_aligned_host_addrs,
|
|
||||||
)?;
|
)?;
|
||||||
let data = translate_slice::<u8>(
|
let data = translate_slice::<u8>(
|
||||||
memory_mapping,
|
memory_mapping,
|
||||||
ix_c.data_addr,
|
ix_c.data_addr,
|
||||||
ix_c.data_len as u64,
|
ix_c.data_len as u64,
|
||||||
self.loader_id,
|
self.loader_id,
|
||||||
enforce_aligned_host_addrs,
|
|
||||||
)?
|
)?
|
||||||
.to_vec();
|
.to_vec();
|
||||||
let accounts = meta_cs
|
let accounts = meta_cs
|
||||||
.iter()
|
.iter()
|
||||||
.map(|meta_c| {
|
.map(|meta_c| {
|
||||||
let pubkey = translate_type::<Pubkey>(
|
let pubkey =
|
||||||
memory_mapping,
|
translate_type::<Pubkey>(memory_mapping, meta_c.pubkey_addr, self.loader_id)?;
|
||||||
meta_c.pubkey_addr,
|
|
||||||
self.loader_id,
|
|
||||||
enforce_aligned_host_addrs,
|
|
||||||
)?;
|
|
||||||
Ok(AccountMeta {
|
Ok(AccountMeta {
|
||||||
pubkey: *pubkey,
|
pubkey: *pubkey,
|
||||||
is_signer: meta_c.is_signer,
|
is_signer: meta_c.is_signer,
|
||||||
@ -2067,26 +1906,18 @@ impl<'a> SyscallInvokeSigned<'a> for SyscallInvokeSignedC<'a> {
|
|||||||
memory_mapping: &MemoryMapping,
|
memory_mapping: &MemoryMapping,
|
||||||
) -> Result<TranslatedAccounts<'a>, EbpfError<BpfError>> {
|
) -> Result<TranslatedAccounts<'a>, EbpfError<BpfError>> {
|
||||||
let invoke_context = self.invoke_context.borrow();
|
let invoke_context = self.invoke_context.borrow();
|
||||||
let enforce_aligned_host_addrs =
|
|
||||||
invoke_context.is_feature_active(&enforce_aligned_host_addrs::id());
|
|
||||||
|
|
||||||
let account_infos = translate_slice::<SolAccountInfo>(
|
let account_infos = translate_slice::<SolAccountInfo>(
|
||||||
memory_mapping,
|
memory_mapping,
|
||||||
account_infos_addr,
|
account_infos_addr,
|
||||||
account_infos_len,
|
account_infos_len,
|
||||||
self.loader_id,
|
self.loader_id,
|
||||||
enforce_aligned_host_addrs,
|
|
||||||
)?;
|
)?;
|
||||||
check_account_infos(account_infos.len(), &invoke_context)?;
|
check_account_infos(account_infos.len(), &invoke_context)?;
|
||||||
let account_info_keys = account_infos
|
let account_info_keys = account_infos
|
||||||
.iter()
|
.iter()
|
||||||
.map(|account_info| {
|
.map(|account_info| {
|
||||||
translate_type::<Pubkey>(
|
translate_type::<Pubkey>(memory_mapping, account_info.key_addr, self.loader_id)
|
||||||
memory_mapping,
|
|
||||||
account_info.key_addr,
|
|
||||||
self.loader_id,
|
|
||||||
enforce_aligned_host_addrs,
|
|
||||||
)
|
|
||||||
})
|
})
|
||||||
.collect::<Result<Vec<_>, EbpfError<BpfError>>>()?;
|
.collect::<Result<Vec<_>, EbpfError<BpfError>>>()?;
|
||||||
|
|
||||||
@ -2098,13 +1929,11 @@ impl<'a> SyscallInvokeSigned<'a> for SyscallInvokeSignedC<'a> {
|
|||||||
memory_mapping,
|
memory_mapping,
|
||||||
account_info.lamports_addr,
|
account_info.lamports_addr,
|
||||||
self.loader_id,
|
self.loader_id,
|
||||||
enforce_aligned_host_addrs,
|
|
||||||
)?;
|
)?;
|
||||||
let owner = translate_type_mut::<Pubkey>(
|
let owner = translate_type_mut::<Pubkey>(
|
||||||
memory_mapping,
|
memory_mapping,
|
||||||
account_info.owner_addr,
|
account_info.owner_addr,
|
||||||
self.loader_id,
|
self.loader_id,
|
||||||
enforce_aligned_host_addrs,
|
|
||||||
)?;
|
)?;
|
||||||
let vm_data_addr = account_info.data_addr;
|
let vm_data_addr = account_info.data_addr;
|
||||||
|
|
||||||
@ -2117,7 +1946,6 @@ impl<'a> SyscallInvokeSigned<'a> for SyscallInvokeSignedC<'a> {
|
|||||||
vm_data_addr,
|
vm_data_addr,
|
||||||
account_info.data_len,
|
account_info.data_len,
|
||||||
self.loader_id,
|
self.loader_id,
|
||||||
enforce_aligned_host_addrs,
|
|
||||||
)?;
|
)?;
|
||||||
|
|
||||||
let first_info_addr = &account_infos[0] as *const _ as u64;
|
let first_info_addr = &account_infos[0] as *const _ as u64;
|
||||||
@ -2137,7 +1965,6 @@ impl<'a> SyscallInvokeSigned<'a> for SyscallInvokeSignedC<'a> {
|
|||||||
memory_mapping,
|
memory_mapping,
|
||||||
ref_of_len_in_input_buffer as *const _ as u64,
|
ref_of_len_in_input_buffer as *const _ as u64,
|
||||||
self.loader_id,
|
self.loader_id,
|
||||||
enforce_aligned_host_addrs,
|
|
||||||
)?;
|
)?;
|
||||||
|
|
||||||
Ok((
|
Ok((
|
||||||
@ -2175,7 +2002,6 @@ impl<'a> SyscallInvokeSigned<'a> for SyscallInvokeSignedC<'a> {
|
|||||||
signers_seeds_addr: u64,
|
signers_seeds_addr: u64,
|
||||||
signers_seeds_len: u64,
|
signers_seeds_len: u64,
|
||||||
memory_mapping: &MemoryMapping,
|
memory_mapping: &MemoryMapping,
|
||||||
enforce_aligned_host_addrs: bool,
|
|
||||||
) -> Result<Vec<Pubkey>, EbpfError<BpfError>> {
|
) -> Result<Vec<Pubkey>, EbpfError<BpfError>> {
|
||||||
if signers_seeds_len > 0 {
|
if signers_seeds_len > 0 {
|
||||||
let signers_seeds = translate_slice::<SolSignerSeedC>(
|
let signers_seeds = translate_slice::<SolSignerSeedC>(
|
||||||
@ -2183,7 +2009,6 @@ impl<'a> SyscallInvokeSigned<'a> for SyscallInvokeSignedC<'a> {
|
|||||||
signers_seeds_addr,
|
signers_seeds_addr,
|
||||||
signers_seeds_len,
|
signers_seeds_len,
|
||||||
self.loader_id,
|
self.loader_id,
|
||||||
enforce_aligned_host_addrs,
|
|
||||||
)?;
|
)?;
|
||||||
if signers_seeds.len() > MAX_SIGNERS {
|
if signers_seeds.len() > MAX_SIGNERS {
|
||||||
return Err(SyscallError::TooManySigners.into());
|
return Err(SyscallError::TooManySigners.into());
|
||||||
@ -2196,7 +2021,6 @@ impl<'a> SyscallInvokeSigned<'a> for SyscallInvokeSignedC<'a> {
|
|||||||
signer_seeds.addr,
|
signer_seeds.addr,
|
||||||
signer_seeds.len,
|
signer_seeds.len,
|
||||||
self.loader_id,
|
self.loader_id,
|
||||||
enforce_aligned_host_addrs,
|
|
||||||
)?;
|
)?;
|
||||||
if seeds.len() > MAX_SEEDS {
|
if seeds.len() > MAX_SEEDS {
|
||||||
return Err(SyscallError::InstructionError(
|
return Err(SyscallError::InstructionError(
|
||||||
@ -2212,7 +2036,6 @@ impl<'a> SyscallInvokeSigned<'a> for SyscallInvokeSignedC<'a> {
|
|||||||
seed.addr,
|
seed.addr,
|
||||||
seed.len,
|
seed.len,
|
||||||
self.loader_id,
|
self.loader_id,
|
||||||
enforce_aligned_host_addrs,
|
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
.collect::<Result<Vec<_>, EbpfError<BpfError>>>()?;
|
.collect::<Result<Vec<_>, EbpfError<BpfError>>>()?;
|
||||||
@ -2412,26 +2235,18 @@ fn call<'a>(
|
|||||||
.get_compute_meter()
|
.get_compute_meter()
|
||||||
.consume(invoke_context.get_compute_budget().invoke_units)?;
|
.consume(invoke_context.get_compute_budget().invoke_units)?;
|
||||||
|
|
||||||
let enforce_aligned_host_addrs =
|
|
||||||
invoke_context.is_feature_active(&enforce_aligned_host_addrs::id());
|
|
||||||
|
|
||||||
let caller_program_id = invoke_context
|
let caller_program_id = invoke_context
|
||||||
.get_caller()
|
.get_caller()
|
||||||
.map_err(SyscallError::InstructionError)?;
|
.map_err(SyscallError::InstructionError)?;
|
||||||
|
|
||||||
// Translate and verify caller's data
|
// Translate and verify caller's data
|
||||||
|
|
||||||
let instruction = syscall.translate_instruction(
|
let instruction = syscall.translate_instruction(instruction_addr, memory_mapping)?;
|
||||||
instruction_addr,
|
|
||||||
memory_mapping,
|
|
||||||
enforce_aligned_host_addrs,
|
|
||||||
)?;
|
|
||||||
let signers = syscall.translate_signers(
|
let signers = syscall.translate_signers(
|
||||||
caller_program_id,
|
caller_program_id,
|
||||||
signers_seeds_addr,
|
signers_seeds_addr,
|
||||||
signers_seeds_len,
|
signers_seeds_len,
|
||||||
memory_mapping,
|
memory_mapping,
|
||||||
enforce_aligned_host_addrs,
|
|
||||||
)?;
|
)?;
|
||||||
let keyed_account_refs = invoke_context
|
let keyed_account_refs = invoke_context
|
||||||
.get_keyed_accounts()
|
.get_keyed_accounts()
|
||||||
@ -2565,7 +2380,6 @@ fn call<'a>(
|
|||||||
account_ref.vm_data_addr,
|
account_ref.vm_data_addr,
|
||||||
account.data().len() as u64,
|
account.data().len() as u64,
|
||||||
&bpf_loader_deprecated::id(), // Don't care since it is byte aligned
|
&bpf_loader_deprecated::id(), // Don't care since it is byte aligned
|
||||||
true,
|
|
||||||
)?;
|
)?;
|
||||||
*account_ref.ref_to_len_in_vm = account.data().len() as u64;
|
*account_ref.ref_to_len_in_vm = account.data().len() as u64;
|
||||||
*account_ref.serialized_len_ptr = account.data().len() as u64;
|
*account_ref.serialized_len_ptr = account.data().len() as u64;
|
||||||
@ -2622,7 +2436,7 @@ impl<'a> SyscallObject<BpfError> for SyscallSetReturnData<'a> {
|
|||||||
invoke_context.set_return_data(None);
|
invoke_context.set_return_data(None);
|
||||||
} else {
|
} else {
|
||||||
let return_data = question_mark!(
|
let return_data = question_mark!(
|
||||||
translate_slice::<u8>(memory_mapping, addr, len, self.loader_id, true),
|
translate_slice::<u8>(memory_mapping, addr, len, self.loader_id),
|
||||||
result
|
result
|
||||||
);
|
);
|
||||||
|
|
||||||
@ -2688,7 +2502,6 @@ impl<'a> SyscallObject<BpfError> for SyscallGetReturnData<'a> {
|
|||||||
return_data_addr,
|
return_data_addr,
|
||||||
length,
|
length,
|
||||||
self.loader_id,
|
self.loader_id,
|
||||||
true,
|
|
||||||
),
|
),
|
||||||
result
|
result
|
||||||
);
|
);
|
||||||
@ -2701,7 +2514,6 @@ impl<'a> SyscallObject<BpfError> for SyscallGetReturnData<'a> {
|
|||||||
program_id_addr,
|
program_id_addr,
|
||||||
1,
|
1,
|
||||||
self.loader_id,
|
self.loader_id,
|
||||||
true,
|
|
||||||
),
|
),
|
||||||
result
|
result
|
||||||
);
|
);
|
||||||
@ -2813,8 +2625,7 @@ mod tests {
|
|||||||
)
|
)
|
||||||
.unwrap();
|
.unwrap();
|
||||||
let translated_pubkey =
|
let translated_pubkey =
|
||||||
translate_type::<Pubkey>(&memory_mapping, 0x100000000, &bpf_loader::id(), true)
|
translate_type::<Pubkey>(&memory_mapping, 0x100000000, &bpf_loader::id()).unwrap();
|
||||||
.unwrap();
|
|
||||||
assert_eq!(pubkey, *translated_pubkey);
|
assert_eq!(pubkey, *translated_pubkey);
|
||||||
|
|
||||||
// Instruction
|
// Instruction
|
||||||
@ -2839,17 +2650,13 @@ mod tests {
|
|||||||
)
|
)
|
||||||
.unwrap();
|
.unwrap();
|
||||||
let translated_instruction =
|
let translated_instruction =
|
||||||
translate_type::<Instruction>(&memory_mapping, 0x100000000, &bpf_loader::id(), true)
|
translate_type::<Instruction>(&memory_mapping, 0x100000000, &bpf_loader::id()).unwrap();
|
||||||
.unwrap();
|
|
||||||
assert_eq!(instruction, *translated_instruction);
|
assert_eq!(instruction, *translated_instruction);
|
||||||
memory_mapping.resize_region::<BpfError>(1, 1).unwrap();
|
memory_mapping.resize_region::<BpfError>(1, 1).unwrap();
|
||||||
assert!(translate_type::<Instruction>(
|
assert!(
|
||||||
&memory_mapping,
|
translate_type::<Instruction>(&memory_mapping, 0x100000000, &bpf_loader::id(),)
|
||||||
0x100000000,
|
.is_err()
|
||||||
&bpf_loader::id(),
|
);
|
||||||
true
|
|
||||||
)
|
|
||||||
.is_err());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
@ -2874,14 +2681,9 @@ mod tests {
|
|||||||
&config,
|
&config,
|
||||||
)
|
)
|
||||||
.unwrap();
|
.unwrap();
|
||||||
let translated_data = translate_slice::<u8>(
|
let translated_data =
|
||||||
&memory_mapping,
|
translate_slice::<u8>(&memory_mapping, data.as_ptr() as u64, 0, &bpf_loader::id())
|
||||||
data.as_ptr() as u64,
|
.unwrap();
|
||||||
0,
|
|
||||||
&bpf_loader::id(),
|
|
||||||
true,
|
|
||||||
)
|
|
||||||
.unwrap();
|
|
||||||
assert_eq!(data, translated_data);
|
assert_eq!(data, translated_data);
|
||||||
assert_eq!(0, translated_data.len());
|
assert_eq!(0, translated_data.len());
|
||||||
|
|
||||||
@ -2907,7 +2709,6 @@ mod tests {
|
|||||||
0x100000000,
|
0x100000000,
|
||||||
data.len() as u64,
|
data.len() as u64,
|
||||||
&bpf_loader::id(),
|
&bpf_loader::id(),
|
||||||
true,
|
|
||||||
)
|
)
|
||||||
.unwrap();
|
.unwrap();
|
||||||
assert_eq!(data, translated_data);
|
assert_eq!(data, translated_data);
|
||||||
@ -2918,7 +2719,6 @@ mod tests {
|
|||||||
data.as_ptr() as u64,
|
data.as_ptr() as u64,
|
||||||
u64::MAX,
|
u64::MAX,
|
||||||
&bpf_loader::id(),
|
&bpf_loader::id(),
|
||||||
true,
|
|
||||||
)
|
)
|
||||||
.is_err());
|
.is_err());
|
||||||
|
|
||||||
@ -2927,7 +2727,6 @@ mod tests {
|
|||||||
0x100000000 - 1,
|
0x100000000 - 1,
|
||||||
data.len() as u64,
|
data.len() as u64,
|
||||||
&bpf_loader::id(),
|
&bpf_loader::id(),
|
||||||
true,
|
|
||||||
)
|
)
|
||||||
.is_err());
|
.is_err());
|
||||||
|
|
||||||
@ -2953,20 +2752,15 @@ mod tests {
|
|||||||
0x100000000,
|
0x100000000,
|
||||||
data.len() as u64,
|
data.len() as u64,
|
||||||
&bpf_loader::id(),
|
&bpf_loader::id(),
|
||||||
true,
|
|
||||||
)
|
)
|
||||||
.unwrap();
|
.unwrap();
|
||||||
assert_eq!(data, translated_data);
|
assert_eq!(data, translated_data);
|
||||||
data[0] = 10;
|
data[0] = 10;
|
||||||
assert_eq!(data, translated_data);
|
assert_eq!(data, translated_data);
|
||||||
assert!(translate_slice::<u64>(
|
assert!(
|
||||||
&memory_mapping,
|
translate_slice::<u64>(&memory_mapping, 0x100000000, u64::MAX, &bpf_loader::id(),)
|
||||||
0x100000000,
|
.is_err()
|
||||||
u64::MAX,
|
);
|
||||||
&bpf_loader::id(),
|
|
||||||
true,
|
|
||||||
)
|
|
||||||
.is_err());
|
|
||||||
|
|
||||||
// Pubkeys
|
// Pubkeys
|
||||||
let mut data = vec![solana_sdk::pubkey::new_rand(); 5];
|
let mut data = vec![solana_sdk::pubkey::new_rand(); 5];
|
||||||
@ -2990,7 +2784,6 @@ mod tests {
|
|||||||
0x100000000,
|
0x100000000,
|
||||||
data.len() as u64,
|
data.len() as u64,
|
||||||
&bpf_loader::id(),
|
&bpf_loader::id(),
|
||||||
true,
|
|
||||||
)
|
)
|
||||||
.unwrap();
|
.unwrap();
|
||||||
assert_eq!(data, translated_data);
|
assert_eq!(data, translated_data);
|
||||||
@ -3024,7 +2817,6 @@ mod tests {
|
|||||||
0x100000000,
|
0x100000000,
|
||||||
string.len() as u64,
|
string.len() as u64,
|
||||||
&bpf_loader::id(),
|
&bpf_loader::id(),
|
||||||
true,
|
|
||||||
&mut |string: &str| {
|
&mut |string: &str| {
|
||||||
assert_eq!(string, "Gaggablaghblagh!");
|
assert_eq!(string, "Gaggablaghblagh!");
|
||||||
Ok(42)
|
Ok(42)
|
||||||
@ -3082,7 +2874,6 @@ mod tests {
|
|||||||
let mut syscall_panic = SyscallPanic {
|
let mut syscall_panic = SyscallPanic {
|
||||||
compute_meter,
|
compute_meter,
|
||||||
loader_id: &bpf_loader::id(),
|
loader_id: &bpf_loader::id(),
|
||||||
enforce_aligned_host_addrs: true,
|
|
||||||
};
|
};
|
||||||
let mut result: Result<u64, EbpfError<BpfError>> = Ok(0);
|
let mut result: Result<u64, EbpfError<BpfError>> = Ok(0);
|
||||||
syscall_panic.call(
|
syscall_panic.call(
|
||||||
@ -3108,7 +2899,6 @@ mod tests {
|
|||||||
let mut syscall_panic = SyscallPanic {
|
let mut syscall_panic = SyscallPanic {
|
||||||
compute_meter,
|
compute_meter,
|
||||||
loader_id: &bpf_loader::id(),
|
loader_id: &bpf_loader::id(),
|
||||||
enforce_aligned_host_addrs: true,
|
|
||||||
};
|
};
|
||||||
let mut result: Result<u64, EbpfError<BpfError>> = Ok(0);
|
let mut result: Result<u64, EbpfError<BpfError>> = Ok(0);
|
||||||
syscall_panic.call(
|
syscall_panic.call(
|
||||||
@ -3137,7 +2927,6 @@ mod tests {
|
|||||||
compute_meter,
|
compute_meter,
|
||||||
logger,
|
logger,
|
||||||
loader_id: &bpf_loader::id(),
|
loader_id: &bpf_loader::id(),
|
||||||
enforce_aligned_host_addrs: true,
|
|
||||||
};
|
};
|
||||||
let config = Config::default();
|
let config = Config::default();
|
||||||
let memory_mapping = MemoryMapping::new::<UserError>(
|
let memory_mapping = MemoryMapping::new::<UserError>(
|
||||||
@ -3211,7 +3000,6 @@ mod tests {
|
|||||||
compute_meter,
|
compute_meter,
|
||||||
logger,
|
logger,
|
||||||
loader_id: &bpf_loader::id(),
|
loader_id: &bpf_loader::id(),
|
||||||
enforce_aligned_host_addrs: true,
|
|
||||||
};
|
};
|
||||||
let mut result: Result<u64, EbpfError<BpfError>> = Ok(0);
|
let mut result: Result<u64, EbpfError<BpfError>> = Ok(0);
|
||||||
syscall_sol_log.call(
|
syscall_sol_log.call(
|
||||||
@ -3282,7 +3070,6 @@ mod tests {
|
|||||||
compute_meter,
|
compute_meter,
|
||||||
logger,
|
logger,
|
||||||
loader_id: &bpf_loader::id(),
|
loader_id: &bpf_loader::id(),
|
||||||
enforce_aligned_host_addrs: true,
|
|
||||||
};
|
};
|
||||||
let config = Config::default();
|
let config = Config::default();
|
||||||
let memory_mapping = MemoryMapping::new::<UserError>(
|
let memory_mapping = MemoryMapping::new::<UserError>(
|
||||||
@ -3518,7 +3305,6 @@ mod tests {
|
|||||||
sha256_byte_cost: 2,
|
sha256_byte_cost: 2,
|
||||||
compute_meter,
|
compute_meter,
|
||||||
loader_id: &bpf_loader_deprecated::id(),
|
loader_id: &bpf_loader_deprecated::id(),
|
||||||
enforce_aligned_host_addrs: true,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
let mut result: Result<u64, EbpfError<BpfError>> = Ok(0);
|
let mut result: Result<u64, EbpfError<BpfError>> = Ok(0);
|
||||||
@ -3859,7 +3645,6 @@ mod tests {
|
|||||||
cost: 1,
|
cost: 1,
|
||||||
compute_meter: compute_meter.clone(),
|
compute_meter: compute_meter.clone(),
|
||||||
loader_id: &bpf_loader::id(),
|
loader_id: &bpf_loader::id(),
|
||||||
enforce_aligned_host_addrs: true,
|
|
||||||
allow_native_ids: true,
|
allow_native_ids: true,
|
||||||
check_seed_length: true,
|
check_seed_length: true,
|
||||||
};
|
};
|
||||||
@ -3878,7 +3663,6 @@ mod tests {
|
|||||||
cost: 1,
|
cost: 1,
|
||||||
compute_meter: compute_meter.clone(),
|
compute_meter: compute_meter.clone(),
|
||||||
loader_id: &bpf_loader::id(),
|
loader_id: &bpf_loader::id(),
|
||||||
enforce_aligned_host_addrs: true,
|
|
||||||
allow_native_ids: true,
|
allow_native_ids: true,
|
||||||
check_seed_length: true,
|
check_seed_length: true,
|
||||||
};
|
};
|
||||||
|
@ -10,8 +10,7 @@ use solana_sdk::{
|
|||||||
account::{AccountSharedData, ReadableAccount, WritableAccount},
|
account::{AccountSharedData, ReadableAccount, WritableAccount},
|
||||||
compute_budget::ComputeBudget,
|
compute_budget::ComputeBudget,
|
||||||
feature_set::{
|
feature_set::{
|
||||||
demote_program_write_locks, neon_evm_compute_budget, tx_wide_compute_cap,
|
demote_program_write_locks, neon_evm_compute_budget, tx_wide_compute_cap, FeatureSet,
|
||||||
updated_verify_policy, FeatureSet,
|
|
||||||
},
|
},
|
||||||
fee_calculator::FeeCalculator,
|
fee_calculator::FeeCalculator,
|
||||||
hash::Hash,
|
hash::Hash,
|
||||||
@ -232,7 +231,6 @@ impl<'a> InvokeContext for ThisInvokeContext<'a> {
|
|||||||
write_privileges,
|
write_privileges,
|
||||||
&mut self.timings,
|
&mut self.timings,
|
||||||
logger,
|
logger,
|
||||||
self.feature_set.is_active(&updated_verify_policy::id()),
|
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
fn get_caller(&self) -> Result<&Pubkey, InstructionError> {
|
fn get_caller(&self) -> Result<&Pubkey, InstructionError> {
|
||||||
@ -427,7 +425,6 @@ impl MessageProcessor {
|
|||||||
rent: &Rent,
|
rent: &Rent,
|
||||||
timings: &mut ExecuteDetailsTimings,
|
timings: &mut ExecuteDetailsTimings,
|
||||||
logger: Rc<RefCell<dyn Logger>>,
|
logger: Rc<RefCell<dyn Logger>>,
|
||||||
updated_verify_policy: bool,
|
|
||||||
demote_program_write_locks: bool,
|
demote_program_write_locks: bool,
|
||||||
) -> Result<(), InstructionError> {
|
) -> Result<(), InstructionError> {
|
||||||
// Verify all executable accounts have zero outstanding refs
|
// Verify all executable accounts have zero outstanding refs
|
||||||
@ -454,7 +451,6 @@ impl MessageProcessor {
|
|||||||
&account,
|
&account,
|
||||||
timings,
|
timings,
|
||||||
true,
|
true,
|
||||||
updated_verify_policy,
|
|
||||||
)
|
)
|
||||||
.map_err(|err| {
|
.map_err(|err| {
|
||||||
ic_logger_msg!(
|
ic_logger_msg!(
|
||||||
@ -563,7 +559,6 @@ impl MessageProcessor {
|
|||||||
&rent_collector.rent,
|
&rent_collector.rent,
|
||||||
timings,
|
timings,
|
||||||
invoke_context.get_logger(),
|
invoke_context.get_logger(),
|
||||||
invoke_context.is_feature_active(&updated_verify_policy::id()),
|
|
||||||
invoke_context.is_feature_active(&demote_program_write_locks::id()),
|
invoke_context.is_feature_active(&demote_program_write_locks::id()),
|
||||||
)?;
|
)?;
|
||||||
|
|
||||||
|
@ -83,10 +83,6 @@ pub mod check_init_vote_data {
|
|||||||
solana_sdk::declare_id!("3ccR6QpxGYsAbWyfevEtBNGfWV4xBffxRj2tD6A9i39F");
|
solana_sdk::declare_id!("3ccR6QpxGYsAbWyfevEtBNGfWV4xBffxRj2tD6A9i39F");
|
||||||
}
|
}
|
||||||
|
|
||||||
pub mod enforce_aligned_host_addrs {
|
|
||||||
solana_sdk::declare_id!("6Qob9Z4RwGdf599FDVCqsjuKjR8ZFR3oVs2ByRLWBsua");
|
|
||||||
}
|
|
||||||
|
|
||||||
pub mod stake_program_v4 {
|
pub mod stake_program_v4 {
|
||||||
solana_sdk::declare_id!("Dc7djyhP9aLfdq2zktpvskeAjpG56msCU1yexpxXiWZb");
|
solana_sdk::declare_id!("Dc7djyhP9aLfdq2zktpvskeAjpG56msCU1yexpxXiWZb");
|
||||||
}
|
}
|
||||||
@ -123,10 +119,6 @@ pub mod vote_stake_checked_instructions {
|
|||||||
solana_sdk::declare_id!("BcWknVcgvonN8sL4HE4XFuEVgfcee5MwxWPAgP6ZV89X");
|
solana_sdk::declare_id!("BcWknVcgvonN8sL4HE4XFuEVgfcee5MwxWPAgP6ZV89X");
|
||||||
}
|
}
|
||||||
|
|
||||||
pub mod updated_verify_policy {
|
|
||||||
solana_sdk::declare_id!("k15tVxtkgsmo7dy6iJ56N5hBCxuQAtqRgYwoTDuwbia");
|
|
||||||
}
|
|
||||||
|
|
||||||
pub mod neon_evm_compute_budget {
|
pub mod neon_evm_compute_budget {
|
||||||
solana_sdk::declare_id!("GLrVvDPkQi5PMYUrsYWT9doZhSHr1BVZXqj5DbFps3rS");
|
solana_sdk::declare_id!("GLrVvDPkQi5PMYUrsYWT9doZhSHr1BVZXqj5DbFps3rS");
|
||||||
}
|
}
|
||||||
@ -231,7 +223,6 @@ lazy_static! {
|
|||||||
(full_inflation::mainnet::certusone::vote::id(), "community vote allowing Certus One to enable full inflation"),
|
(full_inflation::mainnet::certusone::vote::id(), "community vote allowing Certus One to enable full inflation"),
|
||||||
(warp_timestamp_again::id(), "warp timestamp again, adjust bounding to 25% fast 80% slow #15204"),
|
(warp_timestamp_again::id(), "warp timestamp again, adjust bounding to 25% fast 80% slow #15204"),
|
||||||
(check_init_vote_data::id(), "check initialized Vote data"),
|
(check_init_vote_data::id(), "check initialized Vote data"),
|
||||||
(enforce_aligned_host_addrs::id(), "enforce aligned host addresses"),
|
|
||||||
(stake_program_v4::id(), "solana_stake_program v4"),
|
(stake_program_v4::id(), "solana_stake_program v4"),
|
||||||
(secp256k1_recover_syscall_enabled::id(), "secp256k1_recover syscall"),
|
(secp256k1_recover_syscall_enabled::id(), "secp256k1_recover syscall"),
|
||||||
(add_missing_program_error_mappings::id(), "add missing program error mappings"),
|
(add_missing_program_error_mappings::id(), "add missing program error mappings"),
|
||||||
@ -241,7 +232,6 @@ lazy_static! {
|
|||||||
(deterministic_shred_seed_enabled::id(), "deterministic shred seed"),
|
(deterministic_shred_seed_enabled::id(), "deterministic shred seed"),
|
||||||
(verify_tx_signatures_len::id(), "prohibit extra transaction signatures"),
|
(verify_tx_signatures_len::id(), "prohibit extra transaction signatures"),
|
||||||
(vote_stake_checked_instructions::id(), "vote/state program checked instructions #18345"),
|
(vote_stake_checked_instructions::id(), "vote/state program checked instructions #18345"),
|
||||||
(updated_verify_policy::id(), "update verify policy"),
|
|
||||||
(neon_evm_compute_budget::id(), "bump neon_evm's compute budget"),
|
(neon_evm_compute_budget::id(), "bump neon_evm's compute budget"),
|
||||||
(rent_for_sysvars::id(), "collect rent from accounts owned by sysvars"),
|
(rent_for_sysvars::id(), "collect rent from accounts owned by sysvars"),
|
||||||
(libsecp256k1_0_5_upgrade_enabled::id(), "upgrade libsecp256k1 to v0.5.0"),
|
(libsecp256k1_0_5_upgrade_enabled::id(), "upgrade libsecp256k1 to v0.5.0"),
|
||||||
|
Reference in New Issue
Block a user