git: 5628a0901987 - stable/13 - Avoid unaligned writes by fsck_ffs(8).
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Sun, 27 Feb 2022 01:35:17 UTC
The branch stable/13 has been updated by mckusick: URL: https://cgit.FreeBSD.org/src/commit/?id=5628a0901987c5f72403cf69e23701f4cc7bc2e2 commit 5628a0901987c5f72403cf69e23701f4cc7bc2e2 Author: Kirk McKusick <mckusick@FreeBSD.org> AuthorDate: 2022-02-20 21:18:05 +0000 Commit: Kirk McKusick <mckusick@FreeBSD.org> CommitDate: 2022-02-26 21:34:11 +0000 Avoid unaligned writes by fsck_ffs(8). (cherry picked from commit 7a1c1f6a0332c5b60349a5df0e3ce64e5005b2ff) --- sbin/fsck_ffs/setup.c | 30 +++++++++++++++++------------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/sbin/fsck_ffs/setup.c b/sbin/fsck_ffs/setup.c index 87676e8ca7ce..375ba897199a 100644 --- a/sbin/fsck_ffs/setup.c +++ b/sbin/fsck_ffs/setup.c @@ -399,17 +399,19 @@ chkrecovery(int devfd) { struct fsrecovery *fsr; char *fsrbuf; - u_int secsize; + u_int secsize, rdsize; /* * Could not determine if backup material exists, so do not * offer to create it. */ fsrbuf = NULL; + rdsize = sblock.fs_fsize; if (ioctl(devfd, DIOCGSECTORSIZE, &secsize) == -1 || - (fsrbuf = Malloc(secsize)) == NULL || - blread(devfd, fsrbuf, (SBLOCK_UFS2 - secsize) / dev_bsize, - secsize) != 0) { + rdsize % secsize != 0 || + (fsrbuf = Malloc(rdsize)) == NULL || + blread(devfd, fsrbuf, (SBLOCK_UFS2 - rdsize) / dev_bsize, + rdsize) != 0) { free(fsrbuf); return (1); } @@ -417,7 +419,7 @@ chkrecovery(int devfd) * Recovery material has already been created, so do not * need to create it again. */ - fsr = (struct fsrecovery *)&fsrbuf[secsize - sizeof *fsr]; + fsr = (struct fsrecovery *)&fsrbuf[rdsize - sizeof *fsr]; if (fsr->fsr_magic == FS_UFS2_MAGIC) { free(fsrbuf); return (1); @@ -430,8 +432,8 @@ chkrecovery(int devfd) } /* - * Read the last sector of the boot block, replace the last - * 20 bytes with the recovery information, then write it back. + * Read the last filesystem-size piece of the boot block, replace the + * last 20 bytes with the recovery information, then write it back. * The recovery information only works for UFS2 filesystems. */ static void @@ -439,24 +441,26 @@ saverecovery(int readfd, int writefd) { struct fsrecovery *fsr; char *fsrbuf; - u_int secsize; + u_int secsize, rdsize; fsrbuf = NULL; + rdsize = sblock.fs_fsize; if (sblock.fs_magic != FS_UFS2_MAGIC || ioctl(readfd, DIOCGSECTORSIZE, &secsize) == -1 || - (fsrbuf = Malloc(secsize)) == NULL || - blread(readfd, fsrbuf, (SBLOCK_UFS2 - secsize) / dev_bsize, - secsize) != 0) { + rdsize % secsize != 0 || + (fsrbuf = Malloc(rdsize)) == NULL || + blread(readfd, fsrbuf, (SBLOCK_UFS2 - rdsize) / dev_bsize, + rdsize) != 0) { printf("RECOVERY DATA COULD NOT BE CREATED\n"); free(fsrbuf); return; } - fsr = (struct fsrecovery *)&fsrbuf[secsize - sizeof *fsr]; + fsr = (struct fsrecovery *)&fsrbuf[rdsize - sizeof *fsr]; fsr->fsr_magic = sblock.fs_magic; fsr->fsr_fpg = sblock.fs_fpg; fsr->fsr_fsbtodb = sblock.fs_fsbtodb; fsr->fsr_sblkno = sblock.fs_sblkno; fsr->fsr_ncg = sblock.fs_ncg; - blwrite(writefd, fsrbuf, (SBLOCK_UFS2 - secsize) / secsize, secsize); + blwrite(writefd, fsrbuf, (SBLOCK_UFS2 - rdsize) / dev_bsize, rdsize); free(fsrbuf); }