Ignore syscalls which are not registered in cached rbpf executable. (#14898) (#14929)

(cherry picked from commit d026da4a1b)

Co-authored-by: Alexander Meißner <AlexanderMeissner@gmx.net>
This commit is contained in:
mergify[bot]
2021-01-29 11:07:54 -08:00
committed by GitHub
parent cb878f2ea8
commit 5ba8b4884b
2 changed files with 66 additions and 53 deletions

View File

@ -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() {

View File

@ -142,6 +142,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>,
@ -173,50 +186,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 {
@ -227,16 +241,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