diff options
| -rw-r--r-- | src/initramfs.rs | 4 | ||||
| -rw-r--r-- | tests/initramfs.rs | 15 |
2 files changed, 19 insertions, 0 deletions
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::{ @@ -40,6 +41,20 @@ fn diagnoses_missing_or_ambiguous_rt_kernels() { } #[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"); fs::create_dir(rootfs.path().join("boot")).expect("boot directory"); |