From f1d891836e73d503c1841f5e7aee199d2b223afa Mon Sep 17 00:00:00 2001 From: Mary Date: Mon, 17 Apr 2023 15:25:12 +0200 Subject: [PATCH] aya: Correctly set the kernel code version for Ubuntu kernel Fix BPF syscall failure related to the kernel code version. --- aya/src/sys/mod.rs | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/aya/src/sys/mod.rs b/aya/src/sys/mod.rs index 129889c5..514c37e2 100644 --- a/aya/src/sys/mod.rs +++ b/aya/src/sys/mod.rs @@ -8,6 +8,8 @@ mod fake; use std::io; #[cfg(not(test))] use std::{ffi::CString, mem}; +#[cfg(not(test))] +use std::{fs::File, io::Read}; #[cfg(not(test))] use libc::utsname; @@ -82,8 +84,40 @@ pub(crate) fn kernel_version() -> Result<(u32, u32, u32), ()> { Ok((0xff, 0xff, 0xff)) } +#[cfg(not(test))] +fn ubuntu_kernel_version() -> Result<(u32, u32, u32), ()> { + if let Ok(mut file) = File::open("/proc/version_signature") { + let mut buf = String::new(); + let mut major = 0u32; + let mut minor = 0u32; + let mut patch = 0u32; + let format = CString::new("%*s %*s %u.%u.%u\n").unwrap(); + + file.read_to_string(&mut buf).map_err(|_| ())?; + + unsafe { + if libc::sscanf( + buf.as_ptr() as *const _, + format.as_ptr(), + &mut major as *mut u32, + &mut minor as *mut _, + &mut patch as *mut _, + ) == 3 + { + return Ok((major, minor, patch)); + } + } + } + + Err(()) +} + #[cfg(not(test))] pub(crate) fn kernel_version() -> Result<(u32, u32, u32), ()> { + if let Ok(version) = ubuntu_kernel_version() { + return Ok(version); + } + unsafe { let mut v = mem::zeroed::(); if libc::uname(&mut v as *mut _) != 0 {