File 0008-blsuki-append-leftover-LoaderEntries.patch of Package grub2

From 716f057d6f6addd15d1913d4b3a3f879863c5839 Mon Sep 17 00:00:00 2001
From: Michael Chang <mchang@suse.com>
Date: Wed, 1 Apr 2026 12:41:13 +0200
Subject: [PATCH 8/9] blsuki: append leftover LoaderEntries

When merging new BLS entries with the previous LoaderEntries value,
entries that sort after all new items can remain pending in
prev_entries. Those entries were not copied into the output buffer, so
the EFI variable could lose trailing previous entries.

Append any unconsumed previous entries after the merge, verify that
enough UTF-16 space remains, and size the variable from the final write
pointer. This keeps the merged list complete and reports the written
buffer length correctly.

Signed-off-by: Michael Chang <mchang@suse.com>
---
 grub-core/commands/blsuki.c | 34 ++++++++++++++++++++++++++++++++--
 1 file changed, 32 insertions(+), 2 deletions(-)

diff --git a/grub-core/commands/blsuki.c b/grub-core/commands/blsuki.c
index 8364ba9f4..298f04a98 100644
--- a/grub-core/commands/blsuki.c
+++ b/grub-core/commands/blsuki.c
@@ -1489,7 +1489,7 @@ set_bli_loader_entries (enum blsuki_cmd_type cmd_type)
   prev_entries = prev_entries_start;
   prev_entries_size = prev_entries_start_size;
   p = efi_entries;
-  remaining_size = size;
+  remaining_size = size + (prev_entries_start_size / sizeof (*efi_entries));
   /* Create a null separated list of all entries (with the extension removed) */
   FOR_BLSUKI_ENTRIES (entry)
     {
@@ -1552,9 +1552,39 @@ set_bli_loader_entries (enum blsuki_cmd_type cmd_type)
 	}
     }
 
+    /*
+     * Append any entries left unconsumed in prev_entries after the ordered
+     * merge above. Previous entries are only emitted immediately when they
+     * sort before the current new entry; otherwise they remain pending until
+     * here.
+     */
+    if (prev_entries_size != 0 && prev_entries != NULL)
+      {
+	grub_size_t remaining_entries_size;
+
+	remaining_entries_size = prev_entries_size / sizeof (*prev_entries);
+	/*
+	 * remaining_size is tracked in UTF-16 code units, so compare it
+	 * against the number of UTF-16 elements left in the previous buffer.
+	 */
+	if (remaining_size < remaining_entries_size)
+	  {
+	    grub_free (prev_entries_start);
+	    grub_free (efi_entries);
+	    return grub_error (
+		GRUB_ERR_OUT_OF_RANGE,
+		"LoaderEntries buffer too small for previous entries");
+	  }
+
+	grub_memcpy (p, prev_entries, prev_entries_size);
+	p += remaining_entries_size;
+	remaining_size -= remaining_entries_size;
+	prev_entries_size = 0;
+      }
+
   status = grub_efi_set_variable_with_attributes ("LoaderEntries", &bli_vendor_guid,
 					 efi_entries,
-					 size * sizeof (grub_efi_char16_t) + prev_entries_start_size - prev_entries_size,
+					 (p - efi_entries) * sizeof (*efi_entries),
 					 GRUB_EFI_VARIABLE_BOOTSERVICE_ACCESS |
 					 GRUB_EFI_VARIABLE_RUNTIME_ACCESS);
   /* Record that we set the generated entries by this command to LoaderEntries */
-- 
2.53.0

openSUSE Build Service is sponsored by