From 315feea5fcedfc92456e0558fc092dd35c6a36dd Mon Sep 17 00:00:00 2001 From: Motomu Utsumi Date: Wed, 21 May 2025 15:25:16 +0900 Subject: [PATCH] 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 --- loader/bpfloader.rs | 26 +++++++++++++++++++------- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/loader/bpfloader.rs b/loader/bpfloader.rs index 933458b..71b16ba 100644 --- a/loader/bpfloader.rs +++ b/loader/bpfloader.rs @@ -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;