sbpf_runtime/syscalls/
abort.rs1use 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}