grub-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH] font: Try opening fonts from the bundled memdisk


From: Chris Coulson
Subject: [PATCH] font: Try opening fonts from the bundled memdisk
Date: Wed, 26 Apr 2023 12:06:52 +0200

Grub since 93a786a00163e50c29f0394df198518617e1c9a5 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
(ie, /fonts/<name>.pf2).

Signed-off-by: Chris Coulson <chris.coulson@canonical.com>
---
 grub-core/font/font.c | 48 ++++++++++++++++++++++++++++---------------
 1 file changed, 31 insertions(+), 17 deletions(-)

diff --git a/grub-core/font/font.c b/grub-core/font/font.c
index 24adcb35a..7c83467a3 100644
--- a/grub-core/font/font.c
+++ b/grub-core/font/font.c
@@ -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 0;
+  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;
-- 
2.39.2




reply via email to

[Prev in Thread] Current Thread [Next in Thread]