]> git.ipfire.org Git - thirdparty/xfsprogs-dev.git/commitdiff
xfs: tighten up validation of root block in inode forks
authorChristoph Hellwig <hch@lst.de>
Mon, 22 Apr 2024 17:01:08 +0000 (10:01 -0700)
committerDarrick J. Wong <djwong@kernel.org>
Mon, 3 Jun 2024 18:37:39 +0000 (11:37 -0700)
Source kernel commit: d477f1749f00899c71605ea01aba0ce67e030471

Check that root blocks that sit in the inode fork and thus have a NULL
bp don't have siblings.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Darrick J. Wong <djwong@kernel.org>
Signed-off-by: Darrick J. Wong <djwong@kernel.org>
Reviewed-by: Carlos Maiolino <cmaiolino@redhat.com>
libxfs/xfs_btree.c

index 0b5002540b503b04ccdadfecddeacecaa92af822..2f5848b9d51b24d33029892ed4faf03abdf4a622 100644 (file)
@@ -104,7 +104,7 @@ __xfs_btree_check_lblock(
 {
        struct xfs_mount        *mp = cur->bc_mp;
        xfs_failaddr_t          fa;
-       xfs_fsblock_t           fsb = NULLFSBLOCK;
+       xfs_fsblock_t           fsb;
 
        if (xfs_has_crc(mp)) {
                if (!uuid_equal(&block->bb_u.l.bb_uuid, &mp->m_sb.sb_meta_uuid))
@@ -124,9 +124,19 @@ __xfs_btree_check_lblock(
            cur->bc_ops->get_maxrecs(cur, level))
                return __this_address;
 
-       if (bp)
-               fsb = XFS_DADDR_TO_FSB(mp, xfs_buf_daddr(bp));
+       /*
+        * For inode-rooted btrees, the root block sits in the inode fork.  In
+        * that case bp is NULL, and the block must not have any siblings.
+        */
+       if (!bp) {
+               if (block->bb_u.l.bb_leftsib != cpu_to_be64(NULLFSBLOCK))
+                       return __this_address;
+               if (block->bb_u.l.bb_rightsib != cpu_to_be64(NULLFSBLOCK))
+                       return __this_address;
+               return NULL;
+       }
 
+       fsb = XFS_DADDR_TO_FSB(mp, xfs_buf_daddr(bp));
        fa = xfs_btree_check_lblock_siblings(mp, fsb, block->bb_u.l.bb_leftsib);
        if (!fa)
                fa = xfs_btree_check_lblock_siblings(mp, fsb,