diff --git a/backport-Make-SET_VARIABLE-get-handled-individually-in-GetNex.patch b/backport-Make-SET_VARIABLE-get-handled-individually-in-GetNex.patch new file mode 100644 index 0000000..a1d5d92 --- /dev/null +++ b/backport-Make-SET_VARIABLE-get-handled-individually-in-GetNex.patch @@ -0,0 +1,214 @@ +From a6649d6268f5e1fa8e0afe7c713be53fda2ef8b7 Mon Sep 17 00:00:00 2001 +From: Peter Jones +Date: Thu, 6 Aug 2015 10:07:11 -0400 +Subject: [PATCH] Make SET_VARIABLE get handled individually in + GetNextLine() + +Resolves: rhbz#1152550 + +Signed-off-by: Peter Jones +--- + .gitignore | 2 + + grubby.c | 119 +++++++++++++++++++++++++++------ + 2 files changed, 115 insertions(+), 6 deletions(-) + +diff --git a/.gitignore b/.gitignore +index e64d3bc..e78a392 100644 +--- a/.gitignore ++++ b/.gitignore +@@ -1,3 +1,5 @@ + grubby + version.h + *.o ++core.* ++vgcore.* +diff --git a/grubby.c b/grubby.c +index c3249bf..b8115dd 100644 +--- a/grubby.c ++++ b/grubby.c +@@ -77,6 +77,7 @@ struct lineElement { + }; + + enum lineType_e { ++ LT_UNIDENTIFIED = 0, + LT_WHITESPACE = 1 << 0, + LT_TITLE = 1 << 1, + LT_KERNEL = 1 << 2, +@@ -745,6 +746,33 @@ static char * sdupprintf(const char *format, ...) { + return buf; + } + ++static inline int ++kwcmp(struct keywordTypes *kw, const char * label, int case_insensitive) ++{ ++ int kwl = strlen(kw->key); ++ int ll = strlen(label); ++ int rc; ++ int (*snc)(const char *s1, const char *s2, size_t n) = ++ case_insensitive ? strncasecmp : strncmp; ++ int (*sc)(const char *s1, const char *s2) = ++ case_insensitive ? strcasecmp : strcmp; ++ ++ rc = snc(kw->key, label, kwl); ++ if (rc) ++ return rc; ++ ++ for (int i = kwl; i < ll; i++) { ++ if (isspace(label[i])) ++ return 0; ++ if (kw->separatorChar && label[i] == kw->separatorChar) ++ return 0; ++ else if (kw->nextChar && label[i] == kw->nextChar) ++ return 0; ++ return sc(kw->key+kwl, label+kwl); ++ } ++ return 0; ++} ++ + static enum lineType_e preferredLineType(enum lineType_e type, + struct configFileInfo *cfi) { + if (isEfi && cfi == &grub2ConfigType) { +@@ -804,13 +832,8 @@ static char * getuuidbydev(char *device) { + static enum lineType_e getTypeByKeyword(char * keyword, + struct configFileInfo * cfi) { + for (struct keywordTypes *kw = cfi->keywords; kw->key; kw++) { +- if (cfi->caseInsensitive) { +- if (!strcasecmp(keyword, kw->key)) +- return kw->type; +- } else { +- if (!strcmp(keyword, kw->key)) +- return kw->type; +- } ++ if (!kwcmp(kw, keyword, cfi->caseInsensitive)) ++ return kw->type; + } + return LT_UNKNOWN; + } +@@ -898,6 +921,7 @@ static int readFile(int fd, char ** bufPtr) { + } + + static void lineInit(struct singleLine * line) { ++ line->type = LT_UNIDENTIFIED; + line->indent = NULL; + line->elements = NULL; + line->numElements = 0; +@@ -968,7 +992,7 @@ static int lineWrite(FILE * out, struct singleLine * line, + if (fputc('"', out) == EOF) return -1; + + if (fprintf(out, "%s", line->elements[i].item) == -1) return -1; +- if (i < line->numElements - 1) ++ if (i < line->numElements - 1 || line->type == LT_SET_VARIABLE) + if (fprintf(out, "%s", line->elements[i].indent) == -1) return -1; + } + +@@ -1017,6 +1041,8 @@ static int getNextLine(char ** bufPtr, struct singleLine * line, + if (first && *chptr == '=') break; + chptr++; + } ++ if (line->type == LT_UNIDENTIFIED) ++ line->type = getTypeByKeyword(start, cfi); + element->item = strndup(start, chptr - start); + start = chptr; + +@@ -1078,7 +1104,7 @@ static int getNextLine(char ** bufPtr, struct singleLine * line, + line->type = LT_WHITESPACE; + line->numElements = 0; + } +- } else { ++ } else if (line->type == LT_INITRD) { + struct keywordTypes *kw; + + kw = getKeywordByType(line->type, cfi); +@@ -1127,6 +1153,39 @@ static int getNextLine(char ** bufPtr, struct singleLine * line, + } + } + } ++ } else if (line->type == LT_SET_VARIABLE) { ++ /* and if it's a "set blah=" we need to split it ++ * yet a third way to avoid rhbz# XXX FIXME :/ ++ */ ++ char *eq; ++ int l; ++ int numElements = line->numElements; ++ struct lineElement *newElements; ++ eq = strchr(line->elements[1].item, '='); ++ if (!eq) ++ return 0; ++ l = eq - line->elements[1].item; ++ if (eq[1] != 0) ++ numElements++; ++ newElements = calloc(numElements,sizeof (*newElements)); ++ memcpy(&newElements[0], &line->elements[0], ++ sizeof (newElements[0])); ++ newElements[1].item = ++ strndup(line->elements[1].item, l); ++ newElements[1].indent = "="; ++ *(eq++) = '\0'; ++ newElements[2].item = strdup(eq); ++ free(line->elements[1].item); ++ if (line->elements[1].indent) ++ newElements[2].indent = line->elements[1].indent; ++ for (int i = 2; i < line->numElements; i++) { ++ newElements[i+1].item = line->elements[i].item; ++ newElements[i+1].indent = ++ line->elements[i].indent; ++ } ++ free(line->elements); ++ line->elements = newElements; ++ line->numElements = numElements; + } + } + +@@ -1227,7 +1286,8 @@ static struct grubConfig * readConfig(const char * inName, + struct keywordTypes *kwType = getKeywordByType(LT_DEFAULT, cfi); + if (kwType && line->numElements == 3 && + !strcmp(line->elements[1].item, kwType->key) && +- !is_special_grub2_variable(line->elements[2].item)) { ++ !is_special_grub2_variable( ++ line->elements[2].item)) { + dbgPrintf("Line sets default config\n"); + cfg->flags &= ~GRUB_CONFIG_NO_DEFAULT; + defaultLine = line; +@@ -1467,15 +1527,33 @@ static struct grubConfig * readConfig(const char * inName, + } + } + } else if (cfi->defaultIsVariable) { +- char *value = defaultLine->elements[2].item; +- while (*value && (*value == '"' || *value == '\'' || +- *value == ' ' || *value == '\t')) +- value++; +- cfg->defaultImage = strtol(value, &end, 10); +- while (*end && (*end == '"' || *end == '\'' || +- *end == ' ' || *end == '\t')) +- end++; +- if (*end) cfg->defaultImage = -1; ++ if (defaultLine->numElements == 2) { ++ char *value = defaultLine->elements[1].item + 8; ++ while (*value && (*value == '"' || ++ *value == '\'' || ++ *value == ' ' || ++ *value == '\t')) ++ value++; ++ cfg->defaultImage = strtol(value, &end, 10); ++ while (*end && (*end == '"' || *end == '\'' || ++ *end == ' ' || *end == '\t')) ++ end++; ++ if (*end) ++ cfg->defaultImage = -1; ++ } else if (defaultLine->numElements == 3) { ++ char *value = defaultLine->elements[2].item; ++ while (*value && (*value == '"' || ++ *value == '\'' || ++ *value == ' ' || ++ *value == '\t')) ++ value++; ++ cfg->defaultImage = strtol(value, &end, 10); ++ while (*end && (*end == '"' || *end == '\'' || ++ *end == ' ' || *end == '\t')) ++ end++; ++ if (*end) ++ cfg->defaultImage = -1; ++ } + } else if (cfi->defaultSupportSaved && + !strncmp(defaultLine->elements[1].item, "saved", 5)) { + cfg->defaultImage = DEFAULT_SAVED; diff --git a/grubby.spec b/grubby.spec index 4f7c6a7..2cd8abc 100644 --- a/grubby.spec +++ b/grubby.spec @@ -1,6 +1,6 @@ Name: grubby Version: 8.40 -Release: 25 +Release: 26 Summary: Update and display information about the configuration files License: GPLv2+ URL: https://github.com/rhinstaller/grubby @@ -29,6 +29,7 @@ Patch6011: grubby-Make-sure-configure-BOOTLOADER-variables-are-.patch Patch6012: Fix-GCC-warnings-about-possible-string-truncations-a.patch Patch6013: Check-that-pointers-are-not-NULL-before-dereferencin.patch Patch6014: Print-default-image-even-if-isn-t-a-suitable-one.patch +Patch6015: backport-Make-SET_VARIABLE-get-handled-individually-in-GetNex.patch Patch9001: fix-make-test-fail-when-no-boot-partition.patch Patch9002: Fix-make-test-fail-for-g2-1.15.patch @@ -106,6 +107,9 @@ sed -e "s,@@LIBEXECDIR@@,%{_libexecdir}/installkernel,g" %{SOURCE3} > %{buildroo %{_mandir}/man8/*.8* %changelog +- Thu Jan 1 2021 yangzhuangzhuang - 8.40-26 +- Fix the following problem:The grub.cfg file is modified.As a result,the system fails to start. + * Mon Nov 2 2020 yixiangzhike - 8.40-25 - add grub2-tools-minimal to Requires