From nobody Wed Jun 07 23:15:35 2023 X-Original-To: dev-commits-src-all@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4Qc39N1hFGz4bhlX; Wed, 7 Jun 2023 23:15:36 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4Qc39N0hGdz3CwR; Wed, 7 Jun 2023 23:15:36 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1686179736; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=1Wkjd8LdrLkLgun+BB9ZfMp9qPA08w9lGRwWlPl4GZ8=; b=Ci2SRY/gWPaMhZ9VCeB5apKvNvdJq8Tkim96IMNPvH+Q5FVj8J70ugYtLEojwQRcWdvzm2 Lv8AAEUQq8FcBlXpOMS9dg5Ot7ZhIA9P5VYROXO31PawBjFhp+zIH0AdSMAnDIDBeTB1xg oYo4N4WfzCEcxSuVqFrbY1kYSc+Ce/aObItm3szKvUhvV6S+WBGru3koimlv6Q53XURdZ7 shtLPDs+byJt8M8S8vgytA/ni1SaQ5WzmzXpmTNXj2wHBJfQy9k0hJXNs7KYaKeLbwVPby M/pju8HQ2mEMvJtcnPyLzIJp9sBjtN+7n598iOcd/xDBvrHDxsX1rmtiRnCKuQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1686179736; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=1Wkjd8LdrLkLgun+BB9ZfMp9qPA08w9lGRwWlPl4GZ8=; b=BYnCaH83wyZRmFoqjMARFwFXsNPGSZo1YYrJ7VpBbS7bgZ56Dyx5G+cjVtr1k5HMXQu0W4 xdzkYPUISbq4JRACfH0qQeP0pYhMNMLuCOt9gDoB2j1oqPZZAP/NDMXLTR0PWBs0/Dq228 uJ6M+GFX2wJIo4gnKsabwesWzgJFMUzDGv8mwR6/zCHPIDDhj2B80pGxTyAOcqfvObdO8H szpVV9VjlGd3S+iSNg3e4ajfu2BU/n3OFwkFDrd9qxZ/TsH5UOHYKRCJWL2DDkFZzL3Ima 1rzTNJtuM7emZzPoQmyS8b9w3QDNNbDrUFzq3XriMotUDrOhhi6Qy8JkFRM0VQ== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1686179736; a=rsa-sha256; cv=none; b=kYFw2sxZ08SzHIdaHdxeFTJoiRCyfL8LRvihsxSuPt5LVY8YC1mh5f3gPev0N7B4Kwm587 BZ9E7L1UnnRPl7IYPyKWj5FK+YAdnm6z0lmD1RENggozs/IPdMCtgv7ie7aWDcfyZX/fGa FkDVtp6njL0jyuU/8HEz6N7JAL0UolssW73rmEpEz0VPmJMLuTYsoxw8MYUcgPNFh4U5oh bFJcswc6JSVvA7A3ZWM4IOzgUCTMnk9BoR7SGVDZy4Qk+czzIdu3kKadiYh0tt6GUViowt hs+Tl7HAV0mAE8xNlt2xfzGpmqimwolFOTGmLQQp0n9Ge+y5Pwejfc3/CsfiOg== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 4Qc39M6HQVzWGH; Wed, 7 Jun 2023 23:15:35 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.16.1/8.16.1) with ESMTP id 357NFZG1048398; Wed, 7 Jun 2023 23:15:35 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.16.1/8.16.1/Submit) id 357NFZrR048397; Wed, 7 Jun 2023 23:15:35 GMT (envelope-from git) Date: Wed, 7 Jun 2023 23:15:35 GMT Message-Id: <202306072315.357NFZrR048397@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org From: Kirk McKusick Subject: git: fbfbd0638a5a - stable/13 - Fix a bug in fsck_ffs(8) triggered by corrupted filesystems. List-Id: Commit messages for all branches of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-all List-Help: List-Post: List-Subscribe: List-Unsubscribe: Sender: owner-dev-commits-src-all@freebsd.org X-BeenThere: dev-commits-src-all@freebsd.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: mckusick X-Git-Repository: src X-Git-Refname: refs/heads/stable/13 X-Git-Reftype: branch X-Git-Commit: fbfbd0638a5a3dd4f76eaf17f81450cc09d48e5b Auto-Submitted: auto-generated X-ThisMailContainsUnwantedMimeParts: N The branch stable/13 has been updated by mckusick: URL: https://cgit.FreeBSD.org/src/commit/?id=fbfbd0638a5a3dd4f76eaf17f81450cc09d48e5b commit fbfbd0638a5a3dd4f76eaf17f81450cc09d48e5b Author: Kirk McKusick AuthorDate: 2023-05-27 23:07:09 +0000 Commit: Kirk McKusick CommitDate: 2023-06-07 22:44:12 +0000 Fix a bug in fsck_ffs(8) triggered by corrupted filesystems. The last valid inode in the filesystem is maxino - 1, not maxino. Thus validity checks should ino < maxino, not ino <= maxino. Reported-by: Robert Morris PR: 271312 Sponsored-by: The FreeBSD Foundation (cherry picked from commit 11ce203e0535c1c8f520c9bda81ab9326cf5db80) --- sbin/fsck_ffs/dir.c | 4 ++-- sbin/fsck_ffs/fsutil.c | 2 +- sbin/fsck_ffs/inode.c | 14 ++++++++------ sbin/fsck_ffs/pass2.c | 4 ++-- 4 files changed, 13 insertions(+), 11 deletions(-) diff --git a/sbin/fsck_ffs/dir.c b/sbin/fsck_ffs/dir.c index e5f0e1e7e7f4..7ea471bcb30a 100644 --- a/sbin/fsck_ffs/dir.c +++ b/sbin/fsck_ffs/dir.c @@ -126,7 +126,7 @@ check_dirdepth(struct inoinfo *inp) if (inp->i_depth == 0 && updateasked == 0) { updateasked = 1; if (preen) { - pwarn("UPDATING FILESYSTEM TO TRACK DIRECTORY DEPTH"); + pwarn("UPDATING FILESYSTEM TO TRACK DIRECTORY DEPTH\n"); dirdepthupdate = 1; } else { /* @@ -437,7 +437,7 @@ fileerror(ino_t cwd, ino_t ino, const char *errmesg) char pathbuf[MAXPATHLEN + 1]; pwarn("%s ", errmesg); - if (ino < UFS_ROOTINO || ino > maxino) { + if (ino < UFS_ROOTINO || ino >= maxino) { pfatal("out-of-range inode number %ju", (uintmax_t)ino); return; } diff --git a/sbin/fsck_ffs/fsutil.c b/sbin/fsck_ffs/fsutil.c index bed87299a3cf..419d0e91a1df 100644 --- a/sbin/fsck_ffs/fsutil.c +++ b/sbin/fsck_ffs/fsutil.c @@ -169,7 +169,7 @@ inoinfo(ino_t inum) struct inostatlist *ilp; int iloff; - if (inum > maxino) + if (inum >= maxino) errx(EEXIT, "inoinfo: inumber %ju out of range", (uintmax_t)inum); ilp = &inostathead[inum / sblock.fs_ipg]; diff --git a/sbin/fsck_ffs/inode.c b/sbin/fsck_ffs/inode.c index 00a60157138c..7dca95129ed1 100644 --- a/sbin/fsck_ffs/inode.c +++ b/sbin/fsck_ffs/inode.c @@ -433,8 +433,9 @@ void ginode(ino_t inumber, struct inode *ip) { ufs2_daddr_t iblk; + struct ufs2_dinode *dp; - if (inumber < UFS_ROOTINO || inumber > maxino) + if (inumber < UFS_ROOTINO || inumber >= maxino) errx(EEXIT, "bad inode number %ju to ginode", (uintmax_t)inumber); ip->i_number = inumber; @@ -473,14 +474,15 @@ ginode(ino_t inumber, struct inode *ip) } ip->i_dp = (union dinode *) &ip->i_bp->b_un.b_dinode2[inumber - ip->i_bp->b_index]; - if (ffs_verify_dinode_ckhash(&sblock, (struct ufs2_dinode *)ip->i_dp)) { + dp = (struct ufs2_dinode *)ip->i_dp; + /* Do not check hash of inodes being created */ + if (dp->di_mode != 0 && ffs_verify_dinode_ckhash(&sblock, dp)) { pwarn("INODE CHECK-HASH FAILED"); prtinode(ip); if (preen || reply("FIX") != 0) { if (preen) printf(" (FIXED)\n"); - ffs_update_dinode_ckhash(&sblock, - (struct ufs2_dinode *)ip->i_dp); + ffs_update_dinode_ckhash(&sblock, dp); inodirty(ip); } } @@ -1292,7 +1294,7 @@ findino(struct inodesc *idesc) if (dirp->d_ino == 0) return (KEEPON); if (strcmp(dirp->d_name, idesc->id_name) == 0 && - dirp->d_ino >= UFS_ROOTINO && dirp->d_ino <= maxino) { + dirp->d_ino >= UFS_ROOTINO && dirp->d_ino < maxino) { idesc->id_parent = dirp->d_ino; return (STOP|FOUND); } @@ -1322,7 +1324,7 @@ prtinode(struct inode *ip) dp = ip->i_dp; printf(" I=%lu ", (u_long)ip->i_number); - if (ip->i_number < UFS_ROOTINO || ip->i_number > maxino) + if (ip->i_number < UFS_ROOTINO || ip->i_number >= maxino) return; printf(" OWNER="); if ((pw = getpwuid((int)DIP(dp, di_uid))) != NULL) diff --git a/sbin/fsck_ffs/pass2.c b/sbin/fsck_ffs/pass2.c index 8200209cc03e..48bf27a8b142 100644 --- a/sbin/fsck_ffs/pass2.c +++ b/sbin/fsck_ffs/pass2.c @@ -371,7 +371,7 @@ chk1: dirp->d_reclen = proto.d_reclen; } if (dirp->d_ino != 0 && strcmp(dirp->d_name, "..") == 0) { - if (dirp->d_ino > maxino) { + if (dirp->d_ino >= maxino) { direrror(idesc->id_number, "BAD INODE NUMBER FOR '..'"); /* * If we know parent set it now, otherwise let it @@ -471,7 +471,7 @@ chk2: } idesc->id_entryno++; n = 0; - if (dirp->d_ino > maxino) { + if (dirp->d_ino >= maxino) { fileerror(idesc->id_number, dirp->d_ino, "I OUT OF RANGE"); n = reply("REMOVE"); } else if (((dirp->d_ino == UFS_WINO && dirp->d_type != DT_WHT) ||