]> git.ipfire.org Git - thirdparty/xfsprogs-dev.git/commitdiff
xfs: check that bc_nlevels never overflows
authorDarrick J. Wong <djwong@kernel.org>
Thu, 28 Apr 2022 19:39:02 +0000 (15:39 -0400)
committerEric Sandeen <sandeen@sandeen.net>
Thu, 28 Apr 2022 19:39:02 +0000 (15:39 -0400)
Source kernel commit: 4c175af2ccd3e0d618b2af941e656fabc453c4af

Warn if we ever bump nlevels higher than the allowed maximum cursor
height.

Signed-off-by: Darrick J. Wong <djwong@kernel.org>
Reviewed-by: Chandan Babu R <chandan.babu@oracle.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
libxfs/xfs_btree.c
libxfs/xfs_btree_staging.c

index 7097abde649de2e92a5a1099b5217ee60233673f..426ab7f8684636fe4b8e95a714822f67aefec821 100644 (file)
@@ -2934,6 +2934,7 @@ xfs_btree_new_iroot(
        be16_add_cpu(&block->bb_level, 1);
        xfs_btree_set_numrecs(block, 1);
        cur->bc_nlevels++;
+       ASSERT(cur->bc_nlevels <= XFS_BTREE_MAXLEVELS);
        cur->bc_ptrs[level + 1] = 1;
 
        kp = xfs_btree_key_addr(cur, 1, block);
@@ -3097,6 +3098,7 @@ xfs_btree_new_root(
        xfs_btree_setbuf(cur, cur->bc_nlevels, nbp);
        cur->bc_ptrs[cur->bc_nlevels] = nptr;
        cur->bc_nlevels++;
+       ASSERT(cur->bc_nlevels <= XFS_BTREE_MAXLEVELS);
        *stat = 1;
        return 0;
 error0:
index daf9979777296f75884bc499060cedda5542f6ae..aa3d49cf2f624ba4e438091719bcb9f99e8eb54a 100644 (file)
@@ -703,6 +703,7 @@ xfs_btree_bload_compute_geometry(
                         * block-based btree level.
                         */
                        cur->bc_nlevels++;
+                       ASSERT(cur->bc_nlevels <= XFS_BTREE_MAXLEVELS);
                        xfs_btree_bload_level_geometry(cur, bbl, level,
                                        nr_this_level, &avg_per_block,
                                        &level_blocks, &dontcare64);
@@ -718,6 +719,7 @@ xfs_btree_bload_compute_geometry(
 
                        /* Otherwise, we need another level of btree. */
                        cur->bc_nlevels++;
+                       ASSERT(cur->bc_nlevels <= XFS_BTREE_MAXLEVELS);
                }
 
                nr_blocks += level_blocks;