Fix kernel version check for program loading

Before this CL, the kernel version check occurred after all programs
were loaded by `open_file.load()`.

This CL moves the check before `open_file.load()`. It calls
`prog.set_autoload(false)` for programs incompatible with the current
kernel, preventing their auto-load by libbpf.

Test: Verify the program is not loaded if the kver is out of range
Bug: 410982483
Change-Id: Ifacd9dd8696a7bb4fd186ad1faf01fba9f021c6d
This commit is contained in:
Motomu Utsumi 2025-05-21 15:25:16 +09:00
commit 315feea5fc

View file

@ -348,6 +348,23 @@ fn set_skip_loading(
}
}
for mut prog in open_file.progs_mut() {
let name =
prog.name().to_str().ok_or_else(|| anyhow!("Failed to parse prog name into UTF-8"))?;
for prog_desc in file_desc.progs {
if prog_desc.name == name {
if kvers < prog_desc.min_kver || kvers >= prog_desc.max_kver {
info!(
"skipping program {} min_kver:{:x} max_kver:{:x} kvers:{:x}",
name, prog_desc.min_kver, prog_desc.max_kver, kvers
);
prog.set_autoload(false);
}
break;
}
}
}
Ok(())
}
@ -374,8 +391,6 @@ fn libbpf_worker(file_desc: &BpfFileDesc) -> Result<(), anyhow::Error> {
let bpffs_path = "/sys/fs/bpf/".to_owned() + file_desc.prefix;
create_dir(Path::new(&bpffs_path))?;
let kvers = kernel_version()?;
for mut map in loaded_file.maps_mut() {
let mut desc_found = false;
let name =
@ -430,11 +445,8 @@ fn libbpf_worker(file_desc: &BpfFileDesc) -> Result<(), anyhow::Error> {
for prog_desc in file_desc.progs {
if prog_desc.name == name {
desc_found = true;
if kvers < prog_desc.min_kver || kvers >= prog_desc.max_kver {
info!(
"skipping program {} min_kver:{:x} max_kver:{:x} kvers:{:x}",
name, prog_desc.min_kver, prog_desc.max_kver, kvers
);
if !prog.autoload() {
// This program is not loaded
continue;
}
let pinpath_str = bpffs_path.clone() + "prog_" + filename + "_" + &name;