Tested with a VM disk that has unmapped blocks and that fixes it.

On Thu, Feb 15, 2024 at 3:54 PM Nicolas Frayer <nfra...@redhat.com> wrote:
>
> On Thu, Feb 15, 2024 at 2:51 PM Daniel Kiper <dki...@net-space.pl> wrote:
> >
> > Adding Marta, Nicolas, Sebastian and Vladimir...
> >
> > Jon, thank you for the patch!
> >
> > Marta, Nicolas and Sebastian, may I ask you to run tests with this fix?
>
> Thanks Jon, Daniel.
> Sure, I will give it a try.
> I was actually about to send my own version for review.
>
> >
> > Daniel
> >
> > On Sun, Feb 11, 2024 at 10:34:58AM -0500, Jon DeVree wrote:
> > > 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 <n...@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