Bug fix to UFS/FFS superblock integrity checks when reading a superblock.

One of the checks was that the cylinder group size (fs_cgsize)
matched that calculated by CGSIZE(). The value calculated by CGSIZE()
has changed over time as the filesystem has evolved. Thus comparing
the value of CGSIZE() of the current generation filesystem may not
match the size as computed by CGSIZE() that was in effect at the
time an older filesystem was created. Therefore the check for
fs_cgsize is changed to simply ensure that it is not larger than
the filesystem blocksize (fs_bsize).

Reported by: Martin Birgmeier
Tested by:   Martin Birgmeier
MFC after:   1 month (with 076002f24d)
PR:          264450
Differential Revision: https://reviews.freebsd.org/D35219
This commit is contained in:
Kirk McKusick 2022-06-11 11:04:19 -07:00
parent fb6eaf74e9
commit 800a53b445

View File

@ -385,7 +385,7 @@ validate_sblock(struct fs *fs, int isaltsblk)
roundup(howmany(SBLOCKSIZE, fs->fs_fsize), fs->fs_frag) ||
fs->fs_iblkno != fs->fs_cblkno + fs->fs_frag ||
fs->fs_dblkno != fs->fs_iblkno + fs->fs_ipg / INOPF(fs) ||
fs->fs_cgsize != fragroundup(fs, CGSIZE(fs)))
fs->fs_cgsize > fs->fs_bsize)
return (ENOENT);
if (fs->fs_csaddr != cgdmin(fs, 0) ||
fs->fs_cssize !=