grub2/grub-core/fs
Erwan Velu bf29fbd997 fs/xfs: Fix unreadable filesystem with v4 superblock
The commit 8b1e5d193 (fs/xfs: Add bigtime incompat feature support)
introduced the bigtime support by adding some features in v3 inodes.
This change extended grub_xfs_inode struct by 76 bytes but also changed
the computation of XFS_V2_INODE_SIZE and XFS_V3_INODE_SIZE. Prior this
commit, XFS_V2_INODE_SIZE was 100 bytes. After the commit it's 84 bytes
XFS_V2_INODE_SIZE becomes 16 bytes too small.

As a result, the data structures aren't properly aligned and the GRUB
generates "attempt to read or write outside of partition" errors when
trying to read the XFS filesystem:

                             GNU GRUB  version 2.11
	....
	grub> set debug=efi,gpt,xfs
	grub> insmod part_gpt
	grub> ls (hd0,gpt1)/
	partmap/gpt.c:93: Read a valid GPT header
	partmap/gpt.c:115: GPT entry 0: start=4096, length=1953125
	fs/xfs.c:931: Reading sb
	fs/xfs.c:270: Validating superblock
	fs/xfs.c:295: XFS v4 superblock detected
	fs/xfs.c:962: Reading root ino 128
	fs/xfs.c:515: Reading inode (128) - 64, 0
	fs/xfs.c:515: Reading inode (739521961424144223) - 344365866970255880, 3840
	error: attempt to read or write outside of partition.

This commit change the XFS_V2_INODE_SIZE computation by subtracting 76
bytes instead of 92 bytes from the actual size of grub_xfs_inode struct.
This 76 bytes value comes from added members:
	20 grub_uint8_t   unused5
	 1 grub_uint64_t  flags2
        48 grub_uint8_t   unused6

This patch explicitly splits the v2 and v3 parts of the structure.
The unused4 is still ending of the v2 structures and the v3 starts
at unused5. Thanks to this we will avoid future corruptions of v2
or v3 inodes.

The XFS_V2_INODE_SIZE is returning to its expected size and the
filesystem is back to a readable state:

                      GNU GRUB  version 2.11
	....
	grub> set debug=efi,gpt,xfs
	grub> insmod part_gpt
	grub> ls (hd0,gpt1)/
	partmap/gpt.c:93: Read a valid GPT header
	partmap/gpt.c:115: GPT entry 0: start=4096, length=1953125
	fs/xfs.c:931: Reading sb
	fs/xfs.c:270: Validating superblock
	fs/xfs.c:295: XFS v4 superblock detected
	fs/xfs.c:962: Reading root ino 128
	fs/xfs.c:515: Reading inode (128) - 64, 0
	fs/xfs.c:515: Reading inode (128) - 64, 0
	fs/xfs.c:931: Reading sb
	fs/xfs.c:270: Validating superblock
	fs/xfs.c:295: XFS v4 superblock detected
	fs/xfs.c:962: Reading root ino 128
	fs/xfs.c:515: Reading inode (128) - 64, 0
	fs/xfs.c:515: Reading inode (128) - 64, 0
	fs/xfs.c:515: Reading inode (128) - 64, 0
	fs/xfs.c:515: Reading inode (131) - 64, 768
	efi/ fs/xfs.c:515: Reading inode (3145856) - 1464904, 0
	grub2/ fs/xfs.c:515: Reading inode (132) - 64, 1024
	grub/ fs/xfs.c:515: Reading inode (139) - 64, 2816
	grub>

Fixes: 8b1e5d193 (fs/xfs: Add bigtime incompat feature support)

Signed-off-by: Erwan Velu <e.velu@criteo.com>
Tested-by: Carlos Maiolino <cmaiolino@redhat.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>

Origin: upstream, https://git.savannah.gnu.org/cgit/grub.git/commit/?id=a4b495520e4dc41a896a8b916a64eda9970c50ea
Last-Update: 2021-09-24

Patch-Name: xfs-fix-v4-superblock.patch
2021-09-27 20:09:39 +01:00
..
zfs fs: Use 64-bit type for filesystem timestamp 2021-06-01 17:19:13 +02:00
affs.c fs: Use 64-bit type for filesystem timestamp 2021-06-01 17:19:13 +02:00
afs.c Leverage BFS implementation to read AFS. 2011-10-30 16:10:18 +01:00
archelp.c archelp: Never pass NULL as mtime. 2015-07-27 13:19:02 +02:00
bfs.c Change fs functions to add fs_ prefix 2019-04-09 10:03:29 +10:00
btrfs.c fs/btrfs: Squash some uninitialized reads 2021-03-02 15:54:19 +01:00
cbfs.c disk: Rename grub_disk_get_size() to grub_disk_native_sectors() 2020-12-12 01:19:03 +01:00
cpio_be.c Add gcc_struct to all packed structures when compiling with mingw. 2013-12-15 14:14:30 +01:00
cpio_common.c cpio: Disable gcc9 -Waddress-of-packed-member 2019-04-23 11:37:08 +02:00
cpio.c Add gcc_struct to all packed structures when compiling with mingw. 2013-12-15 14:14:30 +01:00
exfat.c exfat reader 2011-04-11 18:13:00 +02:00
ext2.c fs: Use 64-bit type for filesystem timestamp 2021-06-01 17:19:13 +02:00
f2fs.c f2fs: Disable gcc9 -Waddress-of-packed-member 2019-06-03 11:18:31 +02:00
fat.c fs: Use 64-bit type for filesystem timestamp 2021-06-01 17:19:13 +02:00
fshelp.c fs/fshelp: Catch impermissibly large block sizes in read helper 2021-03-02 15:54:18 +01:00
hfs.c fs: Use 64-bit type for filesystem timestamp 2021-06-01 17:19:13 +02:00
hfsplus.c fs: Use 64-bit type for filesystem timestamp 2021-06-01 17:19:13 +02:00
hfspluscomp.c Make grub_zlib_decompress handle incomplete chunks. 2013-12-18 23:39:49 +01:00
iso9660.c fs: Use 64-bit type for filesystem timestamp 2021-06-01 17:19:13 +02:00
jfs.c fs/jfs: Catch infinite recursion 2021-03-02 15:54:18 +01:00
minix2_be.c Handle big-endian minixfs (fixes minixfs tests on bigendian). 2012-04-01 21:35:18 +02:00
minix2.c Split minix.mod into minix.mod and minix2.mod. 2010-09-08 19:13:48 +02:00
minix3_be.c Handle big-endian minixfs (fixes minixfs tests on bigendian). 2012-04-01 21:35:18 +02:00
minix3.c minix3fs support 2011-04-11 08:16:13 +02:00
minix_be.c Handle big-endian minixfs (fixes minixfs tests on bigendian). 2012-04-01 21:35:18 +02:00
minix.c fs/minix: Avoid mistakenly probing ext2 filesystems 2021-04-12 16:22:44 +02:00
newc.c Add gcc_struct to all packed structures when compiling with mingw. 2013-12-15 14:14:30 +01:00
nilfs2.c fs: Use 64-bit type for filesystem timestamp 2021-06-01 17:19:13 +02:00
ntfs.c calloc: Use calloc() at most places 2020-07-29 16:55:47 +02:00
ntfscomp.c Fix warnings when compiling with -O3 2016-02-17 17:56:41 +01:00
odc.c Add gcc_struct to all packed structures when compiling with mingw. 2013-12-15 14:14:30 +01:00
proc.c Change fs functions to add fs_ prefix 2019-04-09 10:03:29 +10:00
reiserfs.c Change fs functions to add fs_ prefix 2019-04-09 10:03:29 +10:00
romfs.c Change fs functions to add fs_ prefix 2019-04-09 10:03:29 +10:00
sfs.c fs/sfs: Fix over-read of root object name 2021-03-02 15:54:18 +01:00
squash4.c fs: Use 64-bit type for filesystem timestamp 2021-06-01 17:19:13 +02:00
tar.c calloc: Use calloc() at most places 2020-07-29 16:55:47 +02:00
udf.c udf: Fix memory leak 2020-07-29 16:55:48 +02:00
ufs2.c automake commit without merge history 2010-05-06 11:34:04 +05:30
ufs_be.c Support big-endian UFS1. 2012-12-08 20:56:58 +01:00
ufs.c fs: Use 64-bit type for filesystem timestamp 2021-06-01 17:19:13 +02:00
xfs.c fs/xfs: Fix unreadable filesystem with v4 superblock 2021-09-27 20:09:39 +01:00