grub-devel
[Top][All Lists]
Advanced

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

Re: [PATCH] fs/xfs: Handle non-continuous data blocks in directory exten


From: Vladimir 'phcoder' Serbinenko
Subject: Re: [PATCH] fs/xfs: Handle non-continuous data blocks in directory extents
Date: Thu, 15 Feb 2024 20:33:13 +0300

Is the pointer guaranteed to be aligned? If not you have to use unaligned access. Any reason not to check it against correct magic and not just zero-out?

Le dim. 11 févr. 2024, 18:36, Jon DeVree <nuxi@vault24.org> a écrit :
The directory extent list does not have to be a continuous list of data
blocks. When GRUB tries to read a non-existant member of the list,
grub_xfs_read_file() will return a block of zero'ed memory. Checking for
a zero'ed magic number is sufficient to skip this non-existant data
block.

Prior to commit 07318ee7e this was handled as a subtle side effect of
reading the (non-existant) tail data structure. Since the block was
zero'ed the computation of the number of directory entries in the block
would return 0 as well.

Fixes: 07318ee7e (fs/xfs: Fix XFS directory extent parsing)
Fixes: https://bugzilla.redhat.com/show_bug.cgi?id=2254370
Signed-off-by: Jon DeVree <nuxi@vault24.org>
---
 grub-core/fs/xfs.c | 10 ++++++++++
 1 file changed, 10 insertions(+)

diff --git a/grub-core/fs/xfs.c b/grub-core/fs/xfs.c
index bc2224dbb..a6cce9cfe 100644
--- a/grub-core/fs/xfs.c
+++ b/grub-core/fs/xfs.c
@@ -902,6 +902,7 @@ grub_xfs_iterate_dir (grub_fshelp_node_t dir,
                                        grub_xfs_first_de(dir->data, dirblock);
            int entries = -1;
            char *end = dirblock + dirblk_size;
+           grub_uint32_t magic;

            numread = grub_xfs_read_file (dir, 0, 0,
                                          blk << dirblk_log2,
@@ -912,6 +913,15 @@ 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 *)dirblock;
+           if (!magic)
+             continue;
+
            /*
             * Leaf and tail information are only in the data block if the number
             * of extents is 1.
--
2.43.0


_______________________________________________
Grub-devel mailing list
Grub-devel@gnu.org
https://lists.gnu.org/mailman/listinfo/grub-devel

reply via email to

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