SHA256
1
0
forked from pool/grub2
grub2/0001-Warn-if-MBR-gap-is-small-and-user-uses-advanced-modu.patch
Michael Chang c18d8c8aff Accepting request 841761 from home:michael-chang:branches:Base:System
- Fix https boot interrupted by unrecognised network address error message
  (bsc#1172952)
  * 0001-add-support-for-UEFI-network-protocols.patch

- grub2.spec: Fix bare words used as string in expression which is no longer
  allowed in rpm 4.16

- Improve the error handling when grub2-install fails with short mbr gap
  (bsc#1176062)
  * 0001-Warn-if-MBR-gap-is-small-and-user-uses-advanced-modu.patch
  * 0002-grub-install-Avoid-incompleted-install-on-i386-pc.patch

OBS-URL: https://build.opensuse.org/request/show/841761
OBS-URL: https://build.opensuse.org/package/show/Base:System/grub2?expand=0&rev=365
2020-10-16 02:22:18 +00:00

234 lines
8.0 KiB
Diff

From 53e9a353dbc5110039bc229e271ea60f7bc5bd69 Mon Sep 17 00:00:00 2001
From: Vladimir 'phcoder' Serbinenko <phcoder@gmail.com>
Date: Mon, 27 Apr 2020 17:51:34 +0200
Subject: [PATCH 1/2] Warn if MBR gap is small and user uses advanced modules
We don't want to support small MBR gap in pair with anything but
the simplest config of biosdisk+part_msdos+simple filesystem. In this
path "simple filesystems" are all current filesystems except zfs and
btrfs.
---
grub-core/partmap/gpt.c | 9 ++++++++-
grub-core/partmap/msdos.c | 7 ++++++-
include/grub/partition.h | 4 +++-
include/grub/util/install.h | 7 +++++--
util/grub-install-common.c | 25 +++++++++++++++++++++++++
util/grub-install.c | 13 +++++++++----
util/grub-setup.c | 2 +-
util/setup.c | 5 +++--
8 files changed, 60 insertions(+), 12 deletions(-)
diff --git a/grub-core/partmap/gpt.c b/grub-core/partmap/gpt.c
index 72a2e37cd..20cbcc7ff 100644
--- a/grub-core/partmap/gpt.c
+++ b/grub-core/partmap/gpt.c
@@ -25,6 +25,9 @@
#include <grub/msdos_partition.h>
#include <grub/gpt_partition.h>
#include <grub/i18n.h>
+#ifdef GRUB_UTIL
+#include <grub/emu/misc.h>
+#endif
GRUB_MOD_LICENSE ("GPLv3+");
@@ -169,7 +172,8 @@ static grub_err_t
gpt_partition_map_embed (struct grub_disk *disk, unsigned int *nsectors,
unsigned int max_nsectors,
grub_embed_type_t embed_type,
- grub_disk_addr_t **sectors)
+ grub_disk_addr_t **sectors,
+ int warn_short)
{
struct gpt_partition_map_embed_ctx ctx = {
.start = 0,
@@ -191,6 +195,9 @@ gpt_partition_map_embed (struct grub_disk *disk, unsigned int *nsectors,
N_("this GPT partition label contains no BIOS Boot Partition;"
" embedding won't be possible"));
+ if (ctx.len < GRUB_MIN_RECOMMENDED_MBRGAP) {
+ grub_util_warn("Your BIOS Boot Partition is under 1 MiB, please increase its size.");
+ }
if (ctx.len < *nsectors)
return grub_error (GRUB_ERR_OUT_OF_RANGE,
N_("your BIOS Boot Partition is too small;"
diff --git a/grub-core/partmap/msdos.c b/grub-core/partmap/msdos.c
index 508f0ff76..fb452d5fc 100644
--- a/grub-core/partmap/msdos.c
+++ b/grub-core/partmap/msdos.c
@@ -243,7 +243,8 @@ static grub_err_t
pc_partition_map_embed (struct grub_disk *disk, unsigned int *nsectors,
unsigned int max_nsectors,
grub_embed_type_t embed_type,
- grub_disk_addr_t **sectors)
+ grub_disk_addr_t **sectors,
+ int warn_short)
{
grub_disk_addr_t end = ~0ULL;
struct grub_msdos_partition_mbr mbr;
@@ -397,6 +398,10 @@ pc_partition_map_embed (struct grub_disk *disk, unsigned int *nsectors,
return GRUB_ERR_NONE;
}
+ if (end < GRUB_MIN_RECOMMENDED_MBRGAP && warn_short) {
+ grub_util_warn("You have a short MBR gap and use advanced config. Please increase post-MBR gap");
+ }
+
if (end <= 1)
return grub_error (GRUB_ERR_FILE_NOT_FOUND,
N_("this msdos-style partition label has no "
diff --git a/include/grub/partition.h b/include/grub/partition.h
index 7adb7ec6e..adc50d680 100644
--- a/include/grub/partition.h
+++ b/include/grub/partition.h
@@ -52,10 +52,12 @@ struct grub_partition_map
grub_partition_iterate_hook_t hook, void *hook_data);
#ifdef GRUB_UTIL
/* Determine sectors available for embedding. */
+#define GRUB_MIN_RECOMMENDED_MBRGAP 1900
grub_err_t (*embed) (struct grub_disk *disk, unsigned int *nsectors,
unsigned int max_nsectors,
grub_embed_type_t embed_type,
- grub_disk_addr_t **sectors);
+ grub_disk_addr_t **sectors,
+ int warn_short);
#endif
};
typedef struct grub_partition_map *grub_partition_map_t;
diff --git a/include/grub/util/install.h b/include/grub/util/install.h
index f56058111..1541ee233 100644
--- a/include/grub/util/install.h
+++ b/include/grub/util/install.h
@@ -194,13 +194,13 @@ grub_util_bios_setup (const char *dir,
const char *boot_file, const char *core_file,
const char *dest, int force,
int fs_probe, int allow_floppy,
- int add_rs_codes);
+ int add_rs_codes, int warn_short_mbr_gap);
void
grub_util_sparc_setup (const char *dir,
const char *boot_file, const char *core_file,
const char *dest, int force,
int fs_probe, int allow_floppy,
- int add_rs_codes);
+ int add_rs_codes, int warn_short_mbr_gap);
char *
grub_install_get_image_targets_string (void);
@@ -269,6 +269,9 @@ grub_util_get_target_name (const struct grub_install_image_target_desc *t);
extern char *grub_install_copy_buffer;
#define GRUB_INSTALL_COPY_BUFFER_SIZE 1048576
+int
+grub_install_is_short_mbrgap_supported(void);
+
int
grub_install_sync_fs_journal (const char *path);
#endif
diff --git a/util/grub-install-common.c b/util/grub-install-common.c
index 9cc217d70..4c04b1bce 100644
--- a/util/grub-install-common.c
+++ b/util/grub-install-common.c
@@ -234,6 +234,31 @@ char *grub_install_source_directory = NULL;
char *grub_install_locale_directory = NULL;
char *grub_install_themes_directory = NULL;
+int
+grub_install_is_short_mbrgap_supported()
+{
+ int i, j;
+ static const char *whitelist[] =
+ {
+ "part_msdos", "biosdisk", "affs", "afs", "bfs", "archelp",
+ "cpio", "cpio_be", "newc", "odc", "ext2", "fat", "exfat",
+ "f2fs", "fshelp", "hfs", "hfsplus", "hfspluscomp",
+ "iso9660", "jfs", "minix", "minix2", "minix3", "minix_be",
+ "minix2_be", "minix2_be", "nilfs2", "ntfs", "ntfscomp",
+ "reiserfs", "romfs", "sfs", "squash4", "tar", "udf",
+ "ufs1", "ufs1_be", "ufs2", "xfs"
+ };
+ for (i = 0; i < modules.n_entries; i++)
+ {
+ for (j = 0; j < ARRAY_SIZE (whitelist); j++)
+ if (strcmp(modules.entries[i], whitelist[j]) == 0)
+ break;
+ if (j == ARRAY_SIZE (whitelist))
+ return 0;
+ }
+ return 1;
+}
+
void
grub_install_push_module (const char *val)
{
diff --git a/util/grub-install.c b/util/grub-install.c
index 8d18f2530..ac8f98552 100644
--- a/util/grub-install.c
+++ b/util/grub-install.c
@@ -1956,9 +1956,14 @@ main (int argc, char *argv[])
/* Now perform the installation. */
if (install_bootsector)
- grub_util_bios_setup (platdir, "boot.img", "core.img",
- install_drive, force,
- fs_probe, allow_floppy, add_rs_codes);
+ {
+ int warn_short_mbr_gap = !grub_install_is_short_mbrgap_supported();
+
+ grub_util_bios_setup (platdir, "boot.img", "core.img",
+ install_drive, force,
+ fs_probe, allow_floppy, add_rs_codes,
+ warn_short_mbr_gap);
+ }
break;
}
case GRUB_INSTALL_PLATFORM_SPARC64_IEEE1275:
@@ -1985,7 +1990,7 @@ main (int argc, char *argv[])
grub_util_sparc_setup (platdir, "boot.img", "core.img",
install_drive, force,
fs_probe, allow_floppy,
- 0 /* unused */ );
+ 0 /* unused */, 0 /* unused */ );
break;
}
diff --git a/util/grub-setup.c b/util/grub-setup.c
index 42b98ad3c..1783224dd 100644
--- a/util/grub-setup.c
+++ b/util/grub-setup.c
@@ -315,7 +315,7 @@ main (int argc, char *argv[])
arguments.core_file ? : DEFAULT_CORE_FILE,
dest_dev, arguments.force,
arguments.fs_probe, arguments.allow_floppy,
- arguments.add_rs_codes);
+ arguments.add_rs_codes, 0);
/* Free resources. */
grub_fini_all ();
diff --git a/util/setup.c b/util/setup.c
index 59b2b4b85..f34dcb0fe 100644
--- a/util/setup.c
+++ b/util/setup.c
@@ -254,7 +254,8 @@ SETUP (const char *dir,
const char *boot_file, const char *core_file,
const char *dest, int force,
int fs_probe, int allow_floppy,
- int add_rs_codes __attribute__ ((unused))) /* unused on sparc64 */
+ int add_rs_codes __attribute__ ((unused)), /* unused on sparc64 */
+ int warn_small)
{
char *core_path;
char *boot_img, *core_img, *boot_path;
@@ -528,7 +529,7 @@ SETUP (const char *dir,
else if (ctx.dest_partmap)
{
err = ctx.dest_partmap->embed (dest_dev->disk, &nsec, maxsec,
- GRUB_EMBED_PCBIOS, &sectors);
+ GRUB_EMBED_PCBIOS, &sectors, warn_small);
#ifdef GRUB_SETUP_BIOS
if ((err == GRUB_ERR_OUT_OF_RANGE || err == GRUB_ERR_FILE_NOT_FOUND)
&& dest_dev->disk->id == root_dev->disk->id
--
2.26.2