From ce79de7ff6b965efa25840b35b0d051c3087db0a Mon Sep 17 00:00:00 2001 From: Dave Tucker Date: Mon, 13 Feb 2023 14:30:21 +0000 Subject: [PATCH] aya: Fix is_perf_link_supported This was mistakenly comparing the exit code of the syscall, which is always -1 and not the corresponding error-code. Added unit tests to ensure we don't regress. Signed-off-by: Dave Tucker --- aya/src/sys/bpf.rs | 34 ++++++++++++++++++++++++++++++++-- 1 file changed, 32 insertions(+), 2 deletions(-) diff --git a/aya/src/sys/bpf.rs b/aya/src/sys/bpf.rs index 20a88f265..366b000fd 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); + } +}