sbpf-runtime 0.2.3

Lightweight runtime for sBPF programs
Documentation
use sbpf_vm::{
    errors::{SbpfVmError, SbpfVmResult},
    memory::Memory,
};

pub fn abort() -> SbpfVmResult<u64> {
    Err(SbpfVmError::Abort)
}

pub fn sol_panic(registers: [u64; 5], memory: &mut Memory) -> SbpfVmResult<u64> {
    let file_ptr = registers[0];
    let file_len = registers[1];
    let line = registers[2];
    let column = registers[3];
    let file_bytes = memory.read_bytes(file_ptr, file_len as usize)?;
    let file = String::from_utf8_lossy(file_bytes);
    eprintln!("Program panicked at {}:{}:{}", file, line, column);
    Err(SbpfVmError::Abort)
}

#[cfg(test)]
mod tests {
    use {super::*, crate::syscalls::tests::test_helpers::make_memory, sbpf_vm::memory::Memory};

    #[test]
    fn test_abort_returns_abort_error() {
        assert!(matches!(abort(), Err(SbpfVmError::Abort)));
    }

    #[test]
    fn test_sol_panic_returns_abort() {
        let mut memory = make_memory();
        let file = b"src/main.rs";
        memory.write_bytes(Memory::HEAP_START, file).unwrap();
        let registers = [Memory::HEAP_START, file.len() as u64, 42, 7, 0];
        assert!(matches!(
            sol_panic(registers, &mut memory),
            Err(SbpfVmError::Abort)
        ));
    }

    #[test]
    fn test_sol_panic_oob_file_ptr_returns_error() {
        let mut memory = make_memory();
        let registers = [0xDEAD_0000_0000, 10, 1, 1, 0];
        let result = sol_panic(registers, &mut memory);
        assert!(result.is_err());
        assert!(!matches!(result, Err(SbpfVmError::Abort)));
    }

    #[test]
    fn test_sol_panic_zero_length_file() {
        let mut memory = make_memory();
        let registers = [Memory::HEAP_START, 0, 0, 0, 0];
        assert!(matches!(
            sol_panic(registers, &mut memory),
            Err(SbpfVmError::Abort)
        ));
    }
}