git: 36e08b0127f9 - main - Bug fix to UFS/FFS superblock integrity checks when reading a superblock.
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Thu, 21 Jul 2022 05:52:42 UTC
The branch main has been updated by mckusick: URL: https://cgit.FreeBSD.org/src/commit/?id=36e08b0127f97928a2f2c062feed8df9087b2b35 commit 36e08b0127f97928a2f2c062feed8df9087b2b35 Author: Kirk McKusick <mckusick@FreeBSD.org> AuthorDate: 2022-07-21 05:51:15 +0000 Commit: Kirk McKusick <mckusick@FreeBSD.org> CommitDate: 2022-07-21 05:52:11 +0000 Bug fix to UFS/FFS superblock integrity checks when reading a superblock. A better fix to commit 9e1f44d044a. Rather than coping with the case where a backup superblock is used, catch the case when the superblock is being read in and ensure that the standard one is used rather than the backup one. --- sys/ufs/ffs/ffs_subr.c | 25 +++++++++++-------------- 1 file changed, 11 insertions(+), 14 deletions(-) diff --git a/sys/ufs/ffs/ffs_subr.c b/sys/ufs/ffs/ffs_subr.c index 21daa44de4d8..1df3f878c4eb 100644 --- a/sys/ufs/ffs/ffs_subr.c +++ b/sys/ufs/ffs/ffs_subr.c @@ -256,6 +256,16 @@ readsuper(void *devfd, struct fs **fsp, off_t sblockloc, int isaltsblk, fs = *fsp; if (fs->fs_magic == FS_BAD_MAGIC) return (EINVAL); + /* + * For UFS1 with a 65536 block size, the first backup superblock + * is at the same location as the UFS2 superblock. Since SBLOCK_UFS2 + * is the first location checked, the first backup is the superblock + * that will be accessed. Here we fail the lookup so that we can + * retry with the correct location for the UFS1 superblock. + */ + if (fs->fs_magic == FS_UFS1_MAGIC && !isaltsblk && + fs->fs_bsize == SBLOCK_UFS2 && sblockloc == SBLOCK_UFS2) + return (ENOENT); if ((error = validate_sblock(fs, isaltsblk)) != 0) return (error); /* @@ -349,20 +359,7 @@ validate_sblock(struct fs *fs, int isaltsblk) } else if (fs->fs_magic == FS_UFS1_MAGIC) { if (!isaltsblk) { CHK(fs->fs_sblockloc, >, SBLOCK_UFS1, %jd); - /* - * For UFS1 the with a 65536 block size, the first - * backup superblock is at the same location as the - * UFS2 superblock. Since SBLOCK_UFS2 is the first - * location checked, the first backup is the - * superblock that will be accessed. - */ - if (fs->fs_bsize == SBLOCK_UFS2) { - CHK(fs->fs_sblockactualloc, >, SBLOCK_UFS2, - %jd); - } else { - CHK2(fs->fs_sblockactualloc, !=, SBLOCK_UFS1, - fs->fs_sblockactualloc, !=, 0, %jd); - } + CHK(fs->fs_sblockactualloc, >, SBLOCK_UFS1, %jd); } CHK(fs->fs_nindir, !=, fs->fs_bsize / sizeof(ufs1_daddr_t), %jd);