From ca3bb8ede742911a26256b70e5f135d9668c44fb Mon Sep 17 00:00:00 2001 From: Hermes Agent Date: Wed, 12 Aug 2026 05:29:13 +0000 Subject: Reject non-regular RT kernel candidates --- src/initramfs.rs | 4 ++++ tests/initramfs.rs | 15 +++++++++++++++ 2 files changed, 19 insertions(+) diff --git a/src/initramfs.rs b/src/initramfs.rs index 1c5c089..ca1063d 100644 --- a/src/initramfs.rs +++ b/src/initramfs.rs @@ -17,6 +17,10 @@ impl KernelVersion { let mut kernels = entries .filter_map(|entry| entry.ok()) .filter_map(|entry| { + let file_type = entry.file_type().ok()?; + if !file_type.is_file() { + return None; + } let name = entry.file_name(); let name = name.to_str()?; let version = name.strip_prefix("vmlinuz-")?; diff --git a/tests/initramfs.rs b/tests/initramfs.rs index b15c54f..f5a7b02 100644 --- a/tests/initramfs.rs +++ b/tests/initramfs.rs @@ -1,4 +1,5 @@ use std::fs; +use std::os::unix::fs::symlink; use std::path::Path; use alt_controller_image::initramfs::{ @@ -39,6 +40,20 @@ fn diagnoses_missing_or_ambiguous_rt_kernels() { assert!(ambiguous.to_string().contains("multiple RT kernel images")); } +#[test] +fn kernel_discovery_ignores_non_regular_vmlinuz_entries() { + let rootfs = tempdir().expect("rootfs directory"); + let boot = rootfs.path().join("boot"); + fs::create_dir(&boot).expect("boot directory"); + fs::create_dir(boot.join("vmlinuz-6.12-rt-directory")).expect("misleading RT directory"); + symlink("/not-a-kernel", boot.join("vmlinuz-6.12-rt-symlink")).expect("misleading RT symlink"); + fs::write(boot.join("vmlinuz-6.12-rt-real"), "kernel").expect("RT kernel"); + + let kernel = KernelVersion::discover_rt(rootfs.path()).expect("discover regular RT kernel"); + + assert_eq!(kernel.as_str(), "6.12-rt-real"); +} + #[test] fn make_initrd_adapter_uses_typed_chroot_arguments_and_records_output_digest() { let rootfs = tempdir().expect("rootfs directory"); -- cgit v1.2.3