Skip to content

Commit

Permalink
aya: Fix is_perf_link_supported
Browse files Browse the repository at this point in the history
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 <dave@dtucker.co.uk>
  • Loading branch information
dave-tucker committed Feb 13, 2023
1 parent d7d6442 commit ce79de7
Showing 1 changed file with 32 additions and 2 deletions.
34 changes: 32 additions & 2 deletions aya/src/sys/bpf.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Expand Down Expand Up @@ -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);
}
}

0 comments on commit ce79de7

Please sign in to comment.