From edb3f9c9b1fd510775332e6788dc1a4d4af68666 Mon Sep 17 00:00:00 2001
From: openEuler Buildteam <buildteam@openEuler.org>
Date: Sat, 11 May 2024 09:22:03 +0800
Subject: [PATCH] Handle non-continuous data blocks in directory extents

---
 grub-core/fs/xfs.c | 11 +++++++++++
 1 file changed, 11 insertions(+)

diff --git a/grub-core/fs/xfs.c b/grub-core/fs/xfs.c
index 1ce5fa4..ed52586 100644
--- a/grub-core/fs/xfs.c
+++ b/grub-core/fs/xfs.c
@@ -904,6 +904,7 @@ grub_xfs_iterate_dir (grub_fshelp_node_t dir,
 
 	    int entries = -1;
 	    char *end = dirblock + dirblk_size;
+	    grub_uint32_t magic;
 
 	    numread = grub_xfs_read_file (dir, 0, 0,
 					  blk << dirblk_log2,
@@ -914,6 +915,16 @@ grub_xfs_iterate_dir (grub_fshelp_node_t dir,
 	        return 0;
 	      }
 
+           /*
+            * If this data block isn't actually part of the extent list then
+            * grub_xfs_read_file() returns a block of zeros. So, if the magic
+            * number field is all zeros then this block should be skipped.
+            */
+           magic = *(grub_uint32_t *)(void *) dirblock;
+           if (!magic)
+             continue;
+
+
 	    /*
 	     * Leaf and tail information are only in the data block if the number
 	     * of extents is 1.
-- 
2.33.0

