File 0001-mdraid1x-fix-raid_disks-decoding-on-big-endian-syste.patch of Package grub2

From 8d188f597796e8559ddc4bf7c9725fede770d486 Mon Sep 17 00:00:00 2001
From: Michael Chang <mchang@suse.com>
Date: Tue, 17 Mar 2026 10:03:46 +0800
Subject: [PATCH] mdraid1x: fix raid_disks decoding on big-endian systems

Commit 99b4c0c38 added mdraid 1.x superblock validation to prevent
infinite recursion, but it converts the 32-bit sb.raid_disks field with
grub_le_to_cpu64().

On big-endian systems this misdecodes valid metadata, so
grub_mdraid_detect() rejects mdraid 1.x arrays and never registers the
mduuid/... device. Affected systems then fail to boot with "disk
`mduuid/<UUID>' not found".

Read sb.raid_disks with grub_le_to_cpu32() and reuse the converted value
for validation and superblock size calculation. This restores mdraid 1.x
detection on big-endian systems and allows them to boot again.

Fixes: 99b4c0c38 ("mdraid1x: add superblock validation to prevent
infinite recursion")

Signed-off-by: Michael Chang <mchang@suse.com>
---
 grub-core/disk/mdraid1x_linux.c | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/grub-core/disk/mdraid1x_linux.c b/grub-core/disk/mdraid1x_linux.c
index e8ff0b534..a239a568c 100644
--- a/grub-core/disk/mdraid1x_linux.c
+++ b/grub-core/disk/mdraid1x_linux.c
@@ -134,6 +134,7 @@ grub_mdraid_detect (grub_disk_t disk,
       struct grub_diskfilter_vg *array;
       char *uuid;
       grub_uint64_t sb_sz, data_end, sb_end;
+      grub_uint32_t raid_disks;
 
       if (size == GRUB_DISK_SIZE_UNKNOWN && minor_version == 0)
 	continue;
@@ -159,12 +160,14 @@ grub_mdraid_detect (grub_disk_t disk,
 	  || grub_le_to_cpu64 (sb.super_offset) != sector)
 	continue;
 
+      raid_disks = grub_le_to_cpu32 (sb.raid_disks);
+
       /*
        * The first check follows the Linux kernel's data_size
        * validation from v6.8-rc5.
        */
       if (grub_le_to_cpu64 (sb.data_size) < 10 ||
-	  grub_le_to_cpu64 (sb.raid_disks) > GRUB_MDRAID_MAX_DISKS)
+	  raid_disks > GRUB_MDRAID_MAX_DISKS)
 	{
 	  grub_dprintf ("mdraid1x", "Corrupted superblock\n");
 	  return NULL;
@@ -174,7 +177,7 @@ grub_mdraid_detect (grub_disk_t disk,
        * Total size of superblock: 256 bytes plus 2 bytes per device
        * in the array.
        */
-      sb_sz = sizeof (struct grub_raid_super_1x) + grub_le_to_cpu64 (sb.raid_disks) * 2;
+      sb_sz = sizeof (struct grub_raid_super_1x) + raid_disks * 2;
 
       if (grub_add (grub_le_to_cpu64 (sb.super_offset),
 		    (ALIGN_UP(sb_sz, GRUB_MD_SECTOR_SIZE) >> GRUB_MD_SECTOR_SHIFT), &sb_end))
-- 
2.53.0

openSUSE Build Service is sponsored by