fix(main): use the boot menu when the entry to boot can't be found

An entry from --boot or LoaderEntryOneShot that didn't match any entry
aborted boot, which happens when the one-shot entry was removed or
misspelled. Log a warning and use the boot menu instead.
This commit is contained in:
alex authored and Alex Zenla committed 2026-09-26 20:52:15 -07:00
1 parent 20ca279fca
commit 8fce1738f2
1 file changed
+22 -7
+22 -7
View File
@@ -379,14 +379,29 @@ fn run() -> Result<()> {
.menu_style .menu_style
.unwrap_or(config.options.menu_style); .unwrap_or(config.options.menu_style);
// Use the forced boot entry if possible, otherwise pick the first entry using a boot menu. // Find the forced boot entry, unless the boot menu is forced.
let entry = if !force_boot_menu && let Some(ref force_boot_entry) = force_boot_entry { // If the forced boot entry can't be found, such as when it was removed,
BootableEntry::find(force_boot_entry, entries.iter()) // the boot menu is used instead.
.context(format!("unable to find entry: {force_boot_entry}"))? let forced_entry = force_boot_entry
} else { .as_ref()
.filter(|_| !force_boot_menu)
.and_then(|force_boot_entry| {
let entry = BootableEntry::find(force_boot_entry, entries.iter());
if entry.is_none() {
warn!(
"unable to find entry '{}', using the boot menu",
force_boot_entry
);
}
entry
});
// Use the forced boot entry if possible, otherwise pick an entry using a boot menu.
let entry = match forced_entry {
Some(entry) => entry,
// Delegate to the menu to select an entry to boot. // Delegate to the menu to select an entry to boot.
menu::select(&timer, menu_timeout, menu_style, &entries) None => menu::select(&timer, menu_timeout, menu_style, &entries)
.context("unable to select entry via boot menu")? .context("unable to select entry via boot menu")?,
}; };
// Tell the bootloader interface what the selected entry is. // Tell the bootloader interface what the selected entry is.