xfs: check that bc_nlevels never overflows
authorDarrick J. Wong <djwong@kernel.org>
Thu, 16 Sep 2021 19:22:08 +0000 (12:22 -0700)
committerDarrick J. Wong <djwong@kernel.org>
Thu, 14 Oct 2021 16:19:32 +0000 (09:19 -0700)
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>
fs/xfs/libxfs/xfs_btree.c
fs/xfs/libxfs/xfs_btree_staging.c

index b0cce0932f02300f2c1f18ea6384e7df2b073549..bc4e49f0456aceec2900a94f1779e77640a8f4ff 100644 (file)
@@ -2933,6 +2933,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);
@@ -3096,6 +3097,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 89c8a1498df1d31f724b7253ef2f6c8c2d2c7e84..cc56efc2b90ac2e41bd9066bcb444e499558236a 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;