]> git.ipfire.org Git - thirdparty/grub.git/commitdiff
font: Try opening fonts from the bundled memdisk
authorChris Coulson <chris.coulson@canonical.com>
Wed, 26 Apr 2023 10:06:52 +0000 (12:06 +0200)
committerDaniel Kiper <daniel.kiper@oracle.com>
Tue, 16 May 2023 16:51:12 +0000 (18:51 +0200)
GRUB since 93a786a00 (kern/efi/sb: Enforce verification of font files)
has enforced verification of font files in secure boot mode. In order to
continue to be able to load some default fonts, vendors may bundle them
with their signed EFI image by adding them to the built-in memdisk.

This change makes the font loader try loading fonts from the memdisk
before the prefix path when attempting to load a font file by specifying
its filename, which avoids having to make changes to GRUB configurations
in order to accommodate memdisk bundled fonts. It expects the directory
structure to be the same as fonts stored in the prefix path,
i.e. /fonts/<name>.pf2.

Signed-off-by: Chris Coulson <chris.coulson@canonical.com>
Reviewed-by: Steve McIntyre <93sam@debian.org>
Tested-by: Steve McIntyre <93sam@debian.org>
Reviewed-by: Robbie Harwood <rharwood@redhat.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
grub-core/font/font.c

index 24adcb35a8676b7abfc37069c7780e4bfef408b3..18de525622e8603d711fdd6e5323092b91d3bacb 100644 (file)
@@ -415,6 +415,27 @@ read_section_as_short (struct font_file_section *section,
   return 0;
 }
 
+static grub_file_t
+try_open_from_prefix (const char *prefix, const char *filename)
+{
+  grub_file_t file;
+  char *fullname, *ptr;
+
+  fullname = grub_malloc (grub_strlen (prefix) + grub_strlen (filename) + 1
+                         + sizeof ("/fonts/") + sizeof (".pf2"));
+  if (!fullname)
+    return NULL;
+  ptr = grub_stpcpy (fullname, prefix);
+  ptr = grub_stpcpy (ptr, "/fonts/");
+  ptr = grub_stpcpy (ptr, filename);
+  ptr = grub_stpcpy (ptr, ".pf2");
+  *ptr = '\0';
+
+  file = grub_buffile_open (fullname, GRUB_FILE_TYPE_FONT, 1024);
+  grub_free (fullname);
+  return file;
+}
+
 /* Load a font and add it to the beginning of the global font list.
    Returns 0 upon success, nonzero upon failure.  */
 grub_font_t
@@ -433,25 +454,18 @@ grub_font_load (const char *filename)
     file = grub_buffile_open (filename, GRUB_FILE_TYPE_FONT, 1024);
   else
     {
-      const char *prefix = grub_env_get ("prefix");
-      char *fullname, *ptr;
-      if (!prefix)
+      file = try_open_from_prefix ("(memdisk)", filename);
+      if (!file)
        {
-         grub_error (GRUB_ERR_FILE_NOT_FOUND, N_("variable `%s' isn't set"),
-                     "prefix");
-         goto fail;
+         const char *prefix = grub_env_get ("prefix");
+
+         if (!prefix)
+           {
+             grub_error (GRUB_ERR_FILE_NOT_FOUND, N_("variable `%s' isn't set"), "prefix");
+             goto fail;
+           }
+         file = try_open_from_prefix (prefix, filename);
        }
-      fullname = grub_malloc (grub_strlen (prefix) + grub_strlen (filename) + 1
-                             + sizeof ("/fonts/") + sizeof (".pf2"));
-      if (!fullname)
-       goto fail;
-      ptr = grub_stpcpy (fullname, prefix);
-      ptr = grub_stpcpy (ptr, "/fonts/");
-      ptr = grub_stpcpy (ptr, filename);
-      ptr = grub_stpcpy (ptr, ".pf2");
-      *ptr = 0;
-      file = grub_buffile_open (fullname, GRUB_FILE_TYPE_FONT, 1024);
-      grub_free (fullname);
     }
   if (!file)
     goto fail;