From a8367596ca63156509eed0b332a077247765b811 Mon Sep 17 00:00:00 2001 From: Robert Marshall Date: Tue, 28 Feb 2017 18:31:56 -0500 Subject: [PATCH 40/55] Fix initial saved_entry read issue (#1285601) If a system has never had a kernel upgrade/rollback then grubby does not read saved_entry properly. Added a guard to catch saved_entry and read it to pick the proper index in these cases. Resolves: rhbz#1285601 --- grubby.c | 29 +++++++++++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/grubby.c b/grubby.c index 9ccad2735dd..974b81c7864 100644 --- a/grubby.c +++ b/grubby.c @@ -2522,6 +2522,9 @@ void setDefaultImage(struct grubConfig *config, int isAddingBootEntry, struct singleEntry *bootEntry, *newDefault; int indexToVerify, firstKernelEntryIndex, currentLookupIndex; + /* initialize */ + currentLookupIndex = FIRST_ENTRY_INDEX; + /* handle the two cases where the user explictly picks the default * boot entry index as it would exist post-modification */ @@ -2587,8 +2590,30 @@ void setDefaultImage(struct grubConfig *config, int isAddingBootEntry, config->defaultImage++; } } else { - /* use pre-existing default entry */ - currentLookupIndex = config->defaultImage; + /* check to see if the default is stored in the environment */ + if (config->defaultImage < FIRST_ENTRY_INDEX) { + if (config->defaultImage == DEFAULT_SAVED || config->defaultImage == DEFAULT_SAVED_GRUB2) + { + if (config->cfi->defaultIsSaved) { + if (config->cfi->getEnv) { + char *defaultTitle = config->cfi->getEnv(config->cfi, "saved_entry"); + + if (defaultTitle) { + if (isnumber(defaultTitle)) { + currentLookupIndex = atoi(defaultTitle); + } else { + findEntryByTitle(config, defaultTitle, ¤tLookupIndex); + } + /* set the default Image to an actual index */ + config->defaultImage = currentLookupIndex; + } + } + } + } + } else { + /* use pre-existing default entry from the file*/ + currentLookupIndex = config->defaultImage; + } if (isAddingBootEntry && (newBootEntryIndex <= config->defaultImage)) { -- 2.17.1