SHA256
1
0
forked from pool/grub2

Accepting request 1188995 from Base:System

OBS-URL: https://build.opensuse.org/request/show/1188995
OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/grub2?expand=0&rev=333
This commit is contained in:
Dominique Leuenberger 2024-07-24 13:32:57 +00:00 committed by Git OBS Bridge
commit 53e10b88bf
3 changed files with 135 additions and 16 deletions

View File

@ -1,4 +1,4 @@
From 58dcf7985b20de876a6fc44a591aa377d0a0302c Mon Sep 17 00:00:00 2001 From db67bd0800c69f94fa3696351e7387515464d30c Mon Sep 17 00:00:00 2001
From: Michael Chang <mchang@suse.com> From: Michael Chang <mchang@suse.com>
Date: Thu, 10 Feb 2022 22:16:58 +0800 Date: Thu, 10 Feb 2022 22:16:58 +0800
Subject: [PATCH] grub-install: bailout root device probing Subject: [PATCH] grub-install: bailout root device probing
@ -15,14 +15,26 @@ filesystem in it's own right.
The command is also used by grub-mkconfig for the same purpose. The command is also used by grub-mkconfig for the same purpose.
v2:
Test the root device first before probing to avoid encountering
unexpected errors. If this test fails, the device is considered
irrelevant and of no interest, as it is not useful.
v2.1:
Besides verifying that the target's canonical path can be resolved,
ensure that the target is a block device file.
Signed-off-by: Michael Chang <mchang@suse.com> Signed-off-by: Michael Chang <mchang@suse.com>
--- ---
grub-core/osdep/basic/no_platform.c | 5 +++++ grub-core/osdep/basic/no_platform.c | 5 +++
grub-core/osdep/unix/platform.c | 34 +++++++++++++++++++++++++++++ grub-core/osdep/unix/getroot.c | 67 +++++++++++++++++++++++++++++
grub-core/osdep/windows/platform.c | 6 +++++ grub-core/osdep/unix/platform.c | 34 +++++++++++++++
include/grub/util/install.h | 3 +++ grub-core/osdep/windows/platform.c | 6 +++
util/grub-install.c | 31 ++++++++++++++++++-------- include/grub/emu/getroot.h | 3 ++
5 files changed, 70 insertions(+), 9 deletions(-) include/grub/util/install.h | 3 ++
util/grub-install.c | 45 +++++++++++++++----
7 files changed, 154 insertions(+), 9 deletions(-)
--- a/grub-core/osdep/basic/no_platform.c --- a/grub-core/osdep/basic/no_platform.c
+++ b/grub-core/osdep/basic/no_platform.c +++ b/grub-core/osdep/basic/no_platform.c
@ -35,6 +47,82 @@ Signed-off-by: Michael Chang <mchang@suse.com>
+{ +{
+ return NULL; + return NULL;
+} +}
--- a/grub-core/osdep/unix/getroot.c
+++ b/grub-core/osdep/unix/getroot.c
@@ -489,6 +489,73 @@
return 0;
}
+#ifdef __linux__
+int
+grub_can_guess_from_mountinfo (const char *dir_in)
+{
+ char **cur;
+ char **os_dev = NULL;
+ char *dir = grub_canonicalize_file_name (dir_in);
+ int ret = 0;
+
+ if (!dir)
+ return 0;
+
+ os_dev = grub_find_root_devices_from_mountinfo (dir, NULL);
+
+ if (!os_dev)
+ os_dev = find_root_devices_from_libzfs (dir);
+
+ if (!os_dev)
+ {
+ free (dir);
+ return 0;
+ }
+
+ for (cur = os_dev; *cur; cur++)
+ {
+ if (strcmp (*cur, "/dev/root") == 0
+ || strncmp (*cur, "/dev/dm-", sizeof ("/dev/dm-") - 1) == 0)
+ /* Assume known and good names */
+ continue;
+ else
+ {
+ struct stat st;
+
+ char *tmp = grub_canonicalize_file_name (*cur);
+ if (tmp == NULL)
+ break;
+
+ if (strncmp (tmp, "/dev/dm-", sizeof ("/dev/dm-") - 1) == 0)
+ continue;
+
+ if (lstat (tmp, &st) < 0)
+ {
+ free (tmp);
+ break;
+ }
+ free (tmp);
+ if (! S_ISBLK (st.st_mode))
+ /* only block device allowed */
+ break;
+ }
+ }
+
+ if (*cur == NULL)
+ /* no bogus device left, good */
+ ret = 1;
+ else
+ grub_util_info ("`%s' is not os device", *cur);
+
+ for (cur = os_dev; *cur; cur++)
+ free (*cur);
+ free (os_dev);
+ free (dir);
+
+ return ret;
+}
+#endif /* __linux__ */
+
char **
grub_guess_root_devices (const char *dir_in)
{
--- a/grub-core/osdep/unix/platform.c --- a/grub-core/osdep/unix/platform.c
+++ b/grub-core/osdep/unix/platform.c +++ b/grub-core/osdep/unix/platform.c
@@ -250,3 +250,37 @@ @@ -250,3 +250,37 @@
@ -87,6 +175,18 @@ Signed-off-by: Michael Chang <mchang@suse.com>
+{ +{
+ return NULL; + return NULL;
+} +}
--- a/include/grub/emu/getroot.h
+++ b/include/grub/emu/getroot.h
@@ -35,6 +35,9 @@
char *grub_find_device (const char *dir, dev_t dev);
void grub_util_pull_device (const char *osname);
+#ifdef __linux__
+int grub_can_guess_from_mountinfo (const char *dir);
+#endif
char **grub_guess_root_devices (const char *dir);
int grub_util_get_dev_abstraction (const char *os_dev);
char *grub_make_system_path_relative_to_its_root (const char *path);
--- a/include/grub/util/install.h --- a/include/grub/util/install.h
+++ b/include/grub/util/install.h +++ b/include/grub/util/install.h
@@ -251,6 +251,9 @@ @@ -251,6 +251,9 @@
@ -101,7 +201,7 @@ Signed-off-by: Michael Chang <mchang@suse.com>
int int
--- a/util/grub-install.c --- a/util/grub-install.c
+++ b/util/grub-install.c +++ b/util/grub-install.c
@@ -887,7 +887,6 @@ @@ -922,7 +922,6 @@
const char *efi_file = NULL; const char *efi_file = NULL;
char **grub_devices; char **grub_devices;
grub_fs_t grub_fs; grub_fs_t grub_fs;
@ -109,7 +209,7 @@ Signed-off-by: Michael Chang <mchang@suse.com>
grub_device_t grub_dev = NULL; grub_device_t grub_dev = NULL;
enum grub_install_plat platform; enum grub_install_plat platform;
char *grubdir, *device_map; char *grubdir, *device_map;
@@ -1067,8 +1066,10 @@ @@ -1102,10 +1101,22 @@
grub_host_init (); grub_host_init ();
{ {
@ -121,8 +221,20 @@ Signed-off-by: Michael Chang <mchang@suse.com>
+ +
char *t = grub_util_path_concat (2, "/", rootdir); char *t = grub_util_path_concat (2, "/", rootdir);
+#ifdef __linux__
+ if (!grub_can_guess_from_mountinfo (t))
+ {
+ free(t);
+ /* We can safely ignore the root probe here; whichever cannot be
+ * reliably detected is irrelevant and of no interest */
+ goto skip_root_probe;
+ }
+#endif
+
rootdir_path = grub_canonicalize_file_name (t); rootdir_path = grub_canonicalize_file_name (t);
@@ -1089,20 +1090,32 @@ if (!rootdir_path)
grub_util_error (_("failed to get canonical path of `%s'"), t);
@@ -1124,22 +1135,38 @@
rootdir_devices[0]); rootdir_devices[0]);
rootdir_grub_dev = grub_device_open (rootdir_grub_devname); rootdir_grub_dev = grub_device_open (rootdir_grub_devname);
@ -160,4 +272,10 @@ Signed-off-by: Michael Chang <mchang@suse.com>
+ grub_device_close (rootdir_grub_dev); + grub_device_close (rootdir_grub_dev);
} }
+#ifdef __linux__
+ skip_root_probe:
+#endif
+
switch (platform) switch (platform)
{
case GRUB_INSTALL_PLATFORM_I386_EFI:

View File

@ -1,3 +1,10 @@
-------------------------------------------------------------------
Fri Jul 19 09:59:15 UTC 2024 - Michael Chang <mchang@suse.com>
- Fix error in grub-install when root is on tmpfs (bsc#1226100)
* 0001-grub-install-bailout-root-device-probing.patch
- Fix incorrect Platform tag in rpm header (bsc#1217967)
------------------------------------------------------------------- -------------------------------------------------------------------
Fri Jul 5 12:23:06 UTC 2024 - Michael Chang <mchang@suse.com> Fri Jul 5 12:23:06 UTC 2024 - Michael Chang <mchang@suse.com>

View File

@ -785,12 +785,6 @@ cd ..
%if ! 0%{?only_efi:1} %if ! 0%{?only_efi:1}
cd build cd build
# 64-bit x86-64 machines use 32-bit boot loader
# (We cannot just redefine _target_cpu, as we'd get i386.rpm packages then)
%ifarch x86_64
%define _target_platform i386-%{_vendor}-%{_target_os}%{?_gnu}
%endif
%if "%{platform}" != "emu" %if "%{platform}" != "emu"
%define arch_specific --enable-device-mapper %define arch_specific --enable-device-mapper
TLFLAGS="-static" TLFLAGS="-static"