diff --git a/aya/src/sys/mod.rs b/aya/src/sys/mod.rs index 514c37e2..294ff386 100644 --- a/aya/src/sys/mod.rs +++ b/aya/src/sys/mod.rs @@ -127,6 +127,33 @@ pub(crate) fn kernel_version() -> Result<(u32, u32, u32), ()> { let mut major = 0u32; let mut minor = 0u32; let mut patch = 0u32; + + let debian_marker = CString::new("Debian").unwrap(); + + let p = libc::strstr(v.version.as_ptr(), debian_marker.as_ptr()); + + if !p.is_null() { + let debian_format = CString::new("Debian %u.%u.%u").map_err(|_| ())?; + + if libc::sscanf( + p, + debian_format.as_ptr(), + &mut major as *mut u32, + &mut minor as *mut _, + &mut patch as *mut _, + ) == 3 + { + // On Debian 10, kernels after 4.19.229 expect 4.19.255 due to broken Makefile patches. + let patch_level_limit = if major == 4 && minor == 19 { 230 } else { 255 }; + + if patch >= patch_level_limit { + patch = 255; + } + + return Ok((major, minor, patch)); + } + } + let format = CString::new("%u.%u.%u").unwrap(); if libc::sscanf( v.release.as_ptr(),