Skip to main content

sbpf_runtime/syscalls/
abort.rs

1use sbpf_vm::{
2    errors::{SbpfVmError, SbpfVmResult},
3    memory::Memory,
4};
5
6pub fn abort() -> SbpfVmResult<u64> {
7    Err(SbpfVmError::Abort)
8}
9
10pub fn sol_panic(registers: [u64; 5], memory: &mut Memory) -> SbpfVmResult<u64> {
11    let file_ptr = registers[0];
12    let file_len = registers[1];
13    let line = registers[2];
14    let column = registers[3];
15    let file_bytes = memory.read_bytes(file_ptr, file_len as usize)?;
16    let file = String::from_utf8_lossy(file_bytes);
17    eprintln!("Program panicked at {}:{}:{}", file, line, column);
18    Err(SbpfVmError::Abort)
19}
20
21#[cfg(test)]
22mod tests {
23    use {super::*, crate::syscalls::tests::test_helpers::make_memory, sbpf_vm::memory::Memory};
24
25    #[test]
26    fn test_abort_returns_abort_error() {
27        assert!(matches!(abort(), Err(SbpfVmError::Abort)));
28    }
29
30    #[test]
31    fn test_sol_panic_returns_abort() {
32        let mut memory = make_memory();
33        let file = b"src/main.rs";
34        memory.write_bytes(Memory::HEAP_START, file).unwrap();
35        let registers = [Memory::HEAP_START, file.len() as u64, 42, 7, 0];
36        assert!(matches!(
37            sol_panic(registers, &mut memory),
38            Err(SbpfVmError::Abort)
39        ));
40    }
41
42    #[test]
43    fn test_sol_panic_oob_file_ptr_returns_error() {
44        let mut memory = make_memory();
45        let registers = [0xDEAD_0000_0000, 10, 1, 1, 0];
46        let result = sol_panic(registers, &mut memory);
47        assert!(result.is_err());
48        assert!(!matches!(result, Err(SbpfVmError::Abort)));
49    }
50
51    #[test]
52    fn test_sol_panic_zero_length_file() {
53        let mut memory = make_memory();
54        let registers = [Memory::HEAP_START, 0, 0, 0, 0];
55        assert!(matches!(
56            sol_panic(registers, &mut memory),
57            Err(SbpfVmError::Abort)
58        ));
59    }
60}