Commit c94613fe authored by Darrick J. Wong's avatar Darrick J. Wong

xfs: fix maxicount division by zero error

In xfs_ialloc_setup_geometry, it's possible for a malicious/corrupt fs
image to set an unreasonably large value for sb_inopblog which will
cause ialloc_blks to be zero.  If sb_imax_pct is also set, this results
in a division by zero error in the second do_div call.  Therefore, force
maxicount to zero if ialloc_blks is zero.

Note that the kernel metadata verifiers will catch the garbage inopblog
value and abort the fs mount long before it tries to set up the inode
geometry; this is needed to avoid a crash in xfs_db while setting up the
xfs_mount structure.

Found by fuzzing sb_inopblog to 122 in xfs/350.
Signed-off-by: default avatarDarrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: default avatarDave Chinner <dchinner@redhat.com>
Reviewed-by: default avatarCarlos Maiolino <cmaiolino@redhat.com>
parent 519e5869
...@@ -2787,8 +2787,13 @@ xfs_ialloc_setup_geometry( ...@@ -2787,8 +2787,13 @@ xfs_ialloc_setup_geometry(
igeo->inobt_maxlevels = xfs_btree_compute_maxlevels(igeo->inobt_mnr, igeo->inobt_maxlevels = xfs_btree_compute_maxlevels(igeo->inobt_mnr,
inodes); inodes);
/* Set the maximum inode count for this filesystem. */ /*
if (sbp->sb_imax_pct) { * Set the maximum inode count for this filesystem, being careful not
* to use obviously garbage sb_inopblog/sb_inopblock values. Regular
* users should never get here due to failing sb verification, but
* certain users (xfs_db) need to be usable even with corrupt metadata.
*/
if (sbp->sb_imax_pct && igeo->ialloc_blks) {
/* /*
* Make sure the maximum inode count is a multiple * Make sure the maximum inode count is a multiple
* of the units we allocate inodes in. * of the units we allocate inodes in.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment