xfs: add more checks to superblock validation

There had been reports where xfs filesystem was randomly
corrupted with fsfuzzer, and xfs failed to handle it
gracefully. This patch fixes couple of reported problem
by providing additional checks in the superblock
validation routine.

Signed-off-by: Olaf Weber <olaf@sgi.com>
Reviewed-by: Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Felix Blyakher <felixb@sgi.com>

authored by

Olaf Weber and committed by
Felix Blyakher
2ac00af7 f25181f5

+3
+3
fs/xfs/xfs_mount.c
··· 291 291 sbp->sb_sectsize > XFS_MAX_SECTORSIZE || 292 292 sbp->sb_sectlog < XFS_MIN_SECTORSIZE_LOG || 293 293 sbp->sb_sectlog > XFS_MAX_SECTORSIZE_LOG || 294 + sbp->sb_sectsize != (1 << sbp->sb_sectlog) || 294 295 sbp->sb_blocksize < XFS_MIN_BLOCKSIZE || 295 296 sbp->sb_blocksize > XFS_MAX_BLOCKSIZE || 296 297 sbp->sb_blocklog < XFS_MIN_BLOCKSIZE_LOG || 297 298 sbp->sb_blocklog > XFS_MAX_BLOCKSIZE_LOG || 299 + sbp->sb_blocksize != (1 << sbp->sb_blocklog) || 298 300 sbp->sb_inodesize < XFS_DINODE_MIN_SIZE || 299 301 sbp->sb_inodesize > XFS_DINODE_MAX_SIZE || 300 302 sbp->sb_inodelog < XFS_DINODE_MIN_LOG || 301 303 sbp->sb_inodelog > XFS_DINODE_MAX_LOG || 304 + sbp->sb_inodesize != (1 << sbp->sb_inodelog) || 302 305 (sbp->sb_blocklog - sbp->sb_inodelog != sbp->sb_inopblog) || 303 306 (sbp->sb_rextsize * sbp->sb_blocksize > XFS_MAX_RTEXTSIZE) || 304 307 (sbp->sb_rextsize * sbp->sb_blocksize < XFS_MIN_RTEXTSIZE) ||