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