diff --git a/aya/src/sys/bpf.rs b/aya/src/sys/bpf.rs index 20a88f26..366b000f 100644 --- a/aya/src/sys/bpf.rs +++ b/aya/src/sys/bpf.rs @@ -617,12 +617,12 @@ pub(crate) fn is_perf_link_supported() -> bool { u.prog_type = bpf_prog_type::BPF_PROG_TYPE_TRACEPOINT as u32; if let Ok(fd) = sys_bpf(bpf_cmd::BPF_PROG_LOAD, &attr) { - if let Err((code, _)) = + if let Err((_, e)) = // Uses an invalid target FD so we get EBADF if supported. bpf_link_create(fd as i32, -1, bpf_attach_type::BPF_PERF_EVENT, None, 0) { // Returns EINVAL if unsupported. EBADF if supported. - let res = code == (-libc::EBADF).into(); + let res = e.raw_os_error() == Some(libc::EBADF); unsafe { libc::close(fd as i32) }; return res; } @@ -892,3 +892,33 @@ where } } } + +#[cfg(test)] +mod tests { + use super::*; + use crate::sys::override_syscall; + use libc::{EBADF, EINVAL}; + + #[test] + fn test_perf_link_supported() { + override_syscall(|call| match call { + Syscall::Bpf { + cmd: bpf_cmd::BPF_LINK_CREATE, + .. + } => Err((-1, io::Error::from_raw_os_error(EBADF))), + _ => Ok(42), + }); + let supported = is_perf_link_supported(); + assert!(supported); + + override_syscall(|call| match call { + Syscall::Bpf { + cmd: bpf_cmd::BPF_LINK_CREATE, + .. + } => Err((-1, io::Error::from_raw_os_error(EINVAL))), + _ => Ok(42), + }); + let supported = is_perf_link_supported(); + assert!(!supported); + } +}