use solana_sbpf::{
ebpf,
program::{FunctionRegistry, SBPFVersion},
verifier::VerifierError,
};
pub(crate) fn verify<T: Copy + PartialEq>(
prog: &[u8],
sbpf_version: SBPFVersion,
syscall_registry: &FunctionRegistry<T>,
) -> Result<(), VerifierError> {
if sbpf_version < SBPFVersion::V3 {
return Ok(());
}
let mut insn_ptr: usize = 0;
while insn_ptr.saturating_add(1).saturating_mul(ebpf::INSN_SIZE) <= prog.len() {
let insn = ebpf::get_insn(prog, insn_ptr);
match insn.opc {
ebpf::LD_DW_IMM => {
insn_ptr = insn_ptr.saturating_add(1);
}
ebpf::CALL_IMM
if insn.src == 0 && syscall_registry.lookup_by_key(insn.imm as u32).is_none() =>
{
return Err(VerifierError::InvalidSyscall(insn.imm as u32));
}
ebpf::CALL_IMM if insn.src == 1 && insn.imm == -1 => {
return Err(VerifierError::InvalidFunction(insn_ptr));
}
_ => (),
}
insn_ptr = insn_ptr.saturating_add(1);
}
Ok(())
}