summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/initramfs.rs4
-rw-r--r--tests/initramfs.rs15
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");