Fetch the repository succeeded.
This action will force synchronization from src-openEuler/grub2, which will overwrite any changes that you have made since you forked the repository, and can not be recovered!!!
Synchronous operation will process in the background and will refresh the page when finishing processing. Please be patient.
From c9198e80f1aa2e9ae9e2bdc8b6f9e9ef601f0971 Mon Sep 17 00:00:00 2001
From: Colin Watson <cjwatson@ubuntu.com>
Date: Mon, 13 Jan 2014 12:13:10 +0000
Subject: [PATCH] Read /etc/default/grub.d/*.cfg after /etc/default/grub
Bug-Ubuntu: https://bugs.launchpad.net/bugs/901600
Forwarded: no
Last-Update: 2021-09-24
Reference:https://sources.debian.org/src/grub2/2.12-1/debian/patches/default-grub-d.patch/
Conflict:NA
---
grub-core/osdep/unix/config.c | 128 ++++++++++++++++++++++++++++------
util/grub-mkconfig.in | 5 ++
2 files changed, 112 insertions(+), 21 deletions(-)
diff --git a/grub-core/osdep/unix/config.c b/grub-core/osdep/unix/config.c
index a84d022..5ee645d 100644
--- a/grub-core/osdep/unix/config.c
+++ b/grub-core/osdep/unix/config.c
@@ -24,6 +24,9 @@
#include <grub/emu/config.h>
#include <grub/util/install.h>
#include <grub/util/misc.h>
+#include <grub/list.h>
+#include <grub/safemath.h>
+#include <assert.h>
#include <string.h>
#include <sys/types.h>
#include <sys/wait.h>
@@ -186,13 +189,27 @@ grub_util_default_distributor (void)
}
#endif
+struct cfglist
+{
+ struct cfglist *next;
+ struct cfglist *prev;
+ char *path;
+};
+
void
grub_util_load_config (struct grub_util_config *cfg)
{
pid_t pid;
const char *argv[4];
- char *script, *ptr;
+ char *script = NULL, *ptr;
const char *cfgfile, *iptr;
+ char *cfgdir;
+ grub_util_fd_dir_t d;
+ struct cfglist *cfgpaths = NULL, *cfgpath, *next_cfgpath;
+ int num_cfgpaths = 0;
+ size_t len_cfgpaths = 0;
+ char **sorted_cfgpaths = NULL;
+ int i;
FILE *f = NULL;
int fd;
const char *v;
@@ -221,29 +238,88 @@ grub_util_load_config (struct grub_util_config *cfg)
}
cfgfile = grub_util_get_config_filename ();
- if (!grub_util_is_regular (cfgfile))
- return;
+ if (grub_util_is_regular (cfgfile))
+ {
+ size_t sz;
+
+ ++num_cfgpaths;
+ sz = strlen (cfgfile);
+ if (grub_mul (sz, 4, &sz) ||
+ grub_add (sz, sizeof (". ''; ") - 1, &sz) ||
+ grub_add (len_cfgpaths, sz, &len_cfgpaths))
+ grub_util_error ("%s", _("overflow is detected"));
+ }
+
+ cfgdir = xasprintf ("%s.d", cfgfile);
+ d = grub_util_fd_opendir (cfgdir);
+ if (d)
+ {
+ grub_util_fd_dirent_t de;
+
+ while ((de = grub_util_fd_readdir (d)))
+ {
+ const char *ext = strrchr (de->d_name, '.');
+ size_t sz;
+
+ if (!ext || strcmp (ext, ".cfg") != 0)
+ continue;
+
+ cfgpath = xmalloc (sizeof (*cfgpath));
+ cfgpath->path = grub_util_path_concat (2, cfgdir, de->d_name);
+ grub_list_push (GRUB_AS_LIST_P (&cfgpaths), GRUB_AS_LIST (cfgpath));
+ ++num_cfgpaths;
+ sz = strlen (cfgpath->path);
+ if (grub_mul (sz, 4, &sz) ||
+ grub_add (sz, sizeof (". ''; ") - 1, &sz) ||
+ grub_add (len_cfgpaths, sz, &len_cfgpaths))
+ grub_util_error ("%s", _("overflow is detected"));
+ }
+ grub_util_fd_closedir (d);
+ }
+
+ if (num_cfgpaths == 0)
+ goto out;
+
+ sorted_cfgpaths = xcalloc (num_cfgpaths, sizeof (*sorted_cfgpaths));
+ i = 0;
+ if (grub_util_is_regular (cfgfile))
+ sorted_cfgpaths[i++] = xstrdup (cfgfile);
+ FOR_LIST_ELEMENTS_SAFE (cfgpath, next_cfgpath, cfgpaths)
+ {
+ sorted_cfgpaths[i++] = cfgpath->path;
+ free (cfgpath);
+ }
+ assert (i == num_cfgpaths);
+ qsort (sorted_cfgpaths + 1, num_cfgpaths - 1, sizeof (*sorted_cfgpaths),
+ (int (*) (const void *, const void *)) strcmp);
argv[0] = "sh";
argv[1] = "-c";
- script = xcalloc (4, strlen (cfgfile) + 300);
+ if (grub_add (len_cfgpaths, 300, &len_cfgpaths))
+ grub_util_error ("%s", _("overflow is detected"));
+ script = xmalloc (len_cfgpaths);
ptr = script;
- memcpy (ptr, ". '", 3);
- ptr += 3;
- for (iptr = cfgfile; *iptr; iptr++)
+ for (i = 0; i < num_cfgpaths; i++)
{
- if (*iptr == '\\')
+ memcpy (ptr, ". '", 3);
+ ptr += 3;
+ for (iptr = sorted_cfgpaths[i]; *iptr; iptr++)
{
- memcpy (ptr, "'\\''", 4);
- ptr += 4;
- continue;
+ if (*iptr == '\\')
+ {
+ memcpy (ptr, "'\\''", 4);
+ ptr += 4;
+ continue;
+ }
+ *ptr++ = *iptr;
}
- *ptr++ = *iptr;
+ memcpy (ptr, "'; ", 3);
+ ptr += 3;
}
- strcpy (ptr, "'; printf \"GRUB_ENABLE_CRYPTODISK=%s\\nGRUB_DISTRIBUTOR=%s\\nSUSE_BTRFS_SNAPSHOT_BOOTING=%s\\n\" "
+ strcpy (ptr, "printf \"GRUB_ENABLE_CRYPTODISK=%s\\nGRUB_DISTRIBUTOR=%s\\nSUSE_BTRFS_SNAPSHOT_BOOTING=%s\\n\" "
"\"$GRUB_ENABLE_CRYPTODISK\" \"$GRUB_DISTRIBUTOR\" \"$SUSE_BTRFS_SNAPSHOT_BOOTING\"");
argv[2] = script;
@@ -272,18 +348,21 @@ grub_util_load_config (struct grub_util_config *cfg)
cfg->grub_distributor = grub_util_default_distributor ();
}
#endif
- return;
+ goto out;
}
- f = grub_util_fopen (cfgfile, "r");
- if (f)
+ for (i = 0; i < num_cfgpaths; i++)
{
- grub_util_parse_config (f, cfg, 0);
- fclose (f);
+ f = grub_util_fopen (sorted_cfgpaths[i], "r");
+ if (f)
+ {
+ grub_util_parse_config (f, cfg, 0);
+ fclose (f);
+ }
+ else
+ grub_util_warn (_("cannot open configuration file `%s': %s"),
+ cfgfile, strerror (errno));
}
- else
- grub_util_warn (_("cannot open configuration file `%s': %s"),
- cfgfile, strerror (errno));
#ifdef __linux__
if (!cfg->grub_distributor || cfg->grub_distributor[0] == '\0')
@@ -293,4 +372,11 @@ grub_util_load_config (struct grub_util_config *cfg)
cfg->grub_distributor = grub_util_default_distributor ();
}
#endif
+
+out:
+ free (script);
+ for (i = 0; i < num_cfgpaths; i++)
+ free (sorted_cfgpaths[i]);
+ free (sorted_cfgpaths);
+ free (cfgdir);
}
diff --git a/util/grub-mkconfig.in b/util/grub-mkconfig.in
index cf5b793..4b3510a 100644
--- a/util/grub-mkconfig.in
+++ b/util/grub-mkconfig.in
@@ -188,6 +188,11 @@ fi
if test -f ${sysconfdir}/default/grub ; then
. ${sysconfdir}/default/grub
fi
+for x in ${sysconfdir}/default/grub.d/*.cfg ; do
+ if [ -e "${x}" ]; then
+ . "${x}"
+ fi
+done
if [ "x${GRUB_DISABLE_UUID}" = "xtrue" ]; then
if [ -z "${GRUB_DISABLE_LINUX_UUID}" ]; then
--
2.33.0
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。