Ignore syscalls which are not registered in cached rbpf executable. (#14898)
This commit is contained in:
parent
996a27d475
commit
d026da4a1b
|
@ -2142,7 +2142,6 @@ fn test_program_upgradeable_locks() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[ignore]
|
|
||||||
#[cfg(feature = "bpf_rust")]
|
#[cfg(feature = "bpf_rust")]
|
||||||
#[test]
|
#[test]
|
||||||
fn test_program_bpf_syscall_feature_activation() {
|
fn test_program_bpf_syscall_feature_activation() {
|
||||||
|
|
|
@ -147,6 +147,19 @@ pub fn register_syscalls(
|
||||||
Ok(syscall_registry)
|
Ok(syscall_registry)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
macro_rules! bind_feature_gated_syscall_context_object {
|
||||||
|
($vm:expr, $invoke_context:expr, $feature_id:expr, $syscall_context_object:expr $(,)?) => {
|
||||||
|
if $invoke_context.is_feature_active($feature_id) {
|
||||||
|
match $vm.bind_syscall_context_object($syscall_context_object, None) {
|
||||||
|
Err(EbpfError::SyscallNotRegistered(_)) | Ok(()) => {}
|
||||||
|
Err(err) => {
|
||||||
|
return Err(err);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
pub fn bind_syscall_context_objects<'a>(
|
pub fn bind_syscall_context_objects<'a>(
|
||||||
loader_id: &'a Pubkey,
|
loader_id: &'a Pubkey,
|
||||||
vm: &mut EbpfVm<'a, BPFError, crate::ThisInstructionMeter>,
|
vm: &mut EbpfVm<'a, BPFError, crate::ThisInstructionMeter>,
|
||||||
|
@ -178,50 +191,51 @@ pub fn bind_syscall_context_objects<'a>(
|
||||||
None,
|
None,
|
||||||
)?;
|
)?;
|
||||||
|
|
||||||
if invoke_context.is_feature_active(&sol_log_compute_units_syscall::id()) {
|
bind_feature_gated_syscall_context_object!(
|
||||||
vm.bind_syscall_context_object(
|
vm,
|
||||||
|
invoke_context,
|
||||||
|
&sol_log_compute_units_syscall::id(),
|
||||||
Box::new(SyscallLogBpfComputeUnits {
|
Box::new(SyscallLogBpfComputeUnits {
|
||||||
cost: 0,
|
cost: 0,
|
||||||
compute_meter: invoke_context.get_compute_meter(),
|
compute_meter: invoke_context.get_compute_meter(),
|
||||||
logger: invoke_context.get_logger(),
|
logger: invoke_context.get_logger(),
|
||||||
}),
|
}),
|
||||||
None,
|
);
|
||||||
)?;
|
|
||||||
}
|
bind_feature_gated_syscall_context_object!(
|
||||||
if invoke_context.is_feature_active(&pubkey_log_syscall_enabled::id()) {
|
vm,
|
||||||
vm.bind_syscall_context_object(
|
invoke_context,
|
||||||
|
&pubkey_log_syscall_enabled::id(),
|
||||||
Box::new(SyscallLogPubkey {
|
Box::new(SyscallLogPubkey {
|
||||||
cost: bpf_compute_budget.log_pubkey_units,
|
cost: bpf_compute_budget.log_pubkey_units,
|
||||||
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,
|
||||||
}),
|
}),
|
||||||
None,
|
);
|
||||||
)?;
|
|
||||||
}
|
|
||||||
|
|
||||||
if invoke_context.is_feature_active(&sha256_syscall_enabled::id()) {
|
bind_feature_gated_syscall_context_object!(
|
||||||
vm.bind_syscall_context_object(
|
vm,
|
||||||
|
invoke_context,
|
||||||
|
&sha256_syscall_enabled::id(),
|
||||||
Box::new(SyscallSha256 {
|
Box::new(SyscallSha256 {
|
||||||
sha256_base_cost: bpf_compute_budget.sha256_base_cost,
|
sha256_base_cost: bpf_compute_budget.sha256_base_cost,
|
||||||
sha256_byte_cost: bpf_compute_budget.sha256_byte_cost,
|
sha256_byte_cost: bpf_compute_budget.sha256_byte_cost,
|
||||||
compute_meter: invoke_context.get_compute_meter(),
|
compute_meter: invoke_context.get_compute_meter(),
|
||||||
loader_id,
|
loader_id,
|
||||||
}),
|
}),
|
||||||
None,
|
);
|
||||||
)?;
|
|
||||||
}
|
|
||||||
|
|
||||||
if invoke_context.is_feature_active(&ristretto_mul_syscall_enabled::id()) {
|
bind_feature_gated_syscall_context_object!(
|
||||||
vm.bind_syscall_context_object(
|
vm,
|
||||||
|
invoke_context,
|
||||||
|
&ristretto_mul_syscall_enabled::id(),
|
||||||
Box::new(SyscallRistrettoMul {
|
Box::new(SyscallRistrettoMul {
|
||||||
cost: 0,
|
cost: 0,
|
||||||
compute_meter: invoke_context.get_compute_meter(),
|
compute_meter: invoke_context.get_compute_meter(),
|
||||||
loader_id,
|
loader_id,
|
||||||
}),
|
}),
|
||||||
None,
|
);
|
||||||
)?;
|
|
||||||
}
|
|
||||||
|
|
||||||
vm.bind_syscall_context_object(
|
vm.bind_syscall_context_object(
|
||||||
Box::new(SyscallCreateProgramAddress {
|
Box::new(SyscallCreateProgramAddress {
|
||||||
|
@ -232,16 +246,16 @@ pub fn bind_syscall_context_objects<'a>(
|
||||||
None,
|
None,
|
||||||
)?;
|
)?;
|
||||||
|
|
||||||
if invoke_context.is_feature_active(&try_find_program_address_syscall_enabled::id()) {
|
bind_feature_gated_syscall_context_object!(
|
||||||
vm.bind_syscall_context_object(
|
vm,
|
||||||
|
invoke_context,
|
||||||
|
&try_find_program_address_syscall_enabled::id(),
|
||||||
Box::new(SyscallTryFindProgramAddress {
|
Box::new(SyscallTryFindProgramAddress {
|
||||||
cost: bpf_compute_budget.create_program_address_units,
|
cost: bpf_compute_budget.create_program_address_units,
|
||||||
compute_meter: invoke_context.get_compute_meter(),
|
compute_meter: invoke_context.get_compute_meter(),
|
||||||
loader_id,
|
loader_id,
|
||||||
}),
|
}),
|
||||||
None,
|
);
|
||||||
)?;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Cross-program invocation syscalls
|
// Cross-program invocation syscalls
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue