]> git.ipfire.org Git - thirdparty/grub.git/commitdiff
mbr: Warn if MBR gap is small and user uses advanced modules
authorVladimir Serbinenko <phcoder@google.com>
Mon, 27 Apr 2020 15:50:04 +0000 (17:50 +0200)
committerDaniel Kiper <daniel.kiper@oracle.com>
Sat, 12 Dec 2020 00:19:03 +0000 (01:19 +0100)
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.

Signed-off-by: Vladimir Serbinenko <phcoder@google.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
grub-core/partmap/gpt.c
grub-core/partmap/msdos.c
include/grub/partition.h
include/grub/util/install.h
util/grub-install-common.c
util/grub-install.c
util/grub-setup.c
util/setup.c

index 72a2e37cd48606583161bd93e72352001c0f1c2d..075cc96f1f62dce23598542993bd6194509eec29 100644 (file)
@@ -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_MBR_GAP)
+    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;"
index ee3f24982b81e8c4964e087539166bf72b1697f9..58c3626c623110f18128e1317a321eb40a335301 100644 (file)
@@ -236,7 +236,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;
@@ -390,6 +391,9 @@ pc_partition_map_embed (struct grub_disk *disk, unsigned int *nsectors,
       return GRUB_ERR_NONE;
     }
 
+  if (end < GRUB_MIN_RECOMMENDED_MBR_GAP && 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 "
index 7adb7ec6eaa2df725c9ba23a61c3cf7fdde5dc6f..8208cc7881860b08e12b015c2613a11578ba3937 100644 (file)
@@ -51,11 +51,14 @@ struct grub_partition_map
   grub_err_t (*iterate) (struct grub_disk *disk,
                         grub_partition_iterate_hook_t hook, void *hook_data);
 #ifdef GRUB_UTIL
+#define GRUB_MIN_RECOMMENDED_MBR_GAP   1900
+
   /* Determine sectors available for embedding.  */
   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;
index 2631b1074513c25a22ff22c21e0d752e24b74279..8cbbc41391f96d566aa7e6ae8bea9bd9e470a06d 100644 (file)
@@ -193,13 +193,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);
@@ -265,4 +265,7 @@ 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);
+
 #endif
index 277eaf4e25c0564e5d4a97bf54e5e6df6df88c55..08d3eb66885976251818333b3fb0ba5d7e45b3f3 100644 (file)
@@ -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 (void)
+{
+  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", "iso9660", "jfs", "minix",
+     "minix2", "minix3", "minix_be", "minix2_be", "nilfs2", "ntfs",
+     "ntfscomp", "reiserfs", "romfs", "sfs", "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)
 {
index a35a2e2e8eeded1b0a1a16153e76960c01235784..6f510fc99f6f14cf48adcac21e04068612c60040 100644 (file)
@@ -1721,7 +1721,8 @@ main (int argc, char *argv[])
        if (install_bootsector)
          grub_util_bios_setup (platdir, "boot.img", "core.img",
                                install_drive, force,
-                               fs_probe, allow_floppy, add_rs_codes);
+                               fs_probe, allow_floppy, add_rs_codes,
+                               !grub_install_is_short_mbrgap_supported ());
        break;
       }
     case GRUB_INSTALL_PLATFORM_SPARC64_IEEE1275:
@@ -1748,7 +1749,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;
       }
 
index 42b98ad3cbaa9824bf6f05218efe58cfb790d547..1783224ddea88d3c66fdd2f81f3243fb7390cb67 100644 (file)
@@ -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 ();
index 3be88aae160e4c6ae0f9559887b206a960596959..da5f2c07f5071044e97d3d323f461730f5a91ade 100644 (file)
@@ -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;
@@ -530,7 +531,7 @@ SETUP (const char *dir,
                                 GRUB_EMBED_PCBIOS, &sectors);
     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);
     else
       err = fs->fs_embed (dest_dev, &nsec, maxsec,
                          GRUB_EMBED_PCBIOS, &sectors);