From: Cheng Yongkang <teel4res@gmail.com>
To: Jaegeuk Kim <jaegeuk@kernel.org>, Chao Yu <chao@kernel.org>
Cc: Cheng Yongkang <teel4res@gmail.com>,
linux-kernel@vger.kernel.org,
linux-f2fs-devel@lists.sourceforge.net
Subject: [f2fs-dev] [PATCH 1/3] f2fs: reject non-directory parent inode during dentry recovery
Date: Sun, 25 Oct 2026 11:02:05 -0700 [thread overview]
Message-ID: <20261025180207.348498-2-teel4res@gmail.com> (raw)
In-Reply-To: <20261025180207.348498-1-teel4res@gmail.com>
recover_dentry() takes i_pino from the on-disk inode and uses the
resulting inode as the directory for __f2fs_find_entry() and
f2fs_add_dentry(). A crafted image can set i_pino to a regular or
special inode; the recovery code does not check S_ISDIR() and then
writes a dentry into a non-directory inode, extending its i_size and
changing its directory-only metadata.
Reject the record with -EFSCORRUPTED and mark the filesystem for fsck:
F2FS-fs (loop0): recover_dentry: ino 4 is not a directory
F2FS-fs (loop0): Cannot recover all fsync data errno=-117
This was reproduced 3/3 times with a crafted image and the patched
kernel leaves the target regular file unmodified in 3/3 runs.
Assisted-by: LLM
Signed-off-by: Cheng Yongkang <teel4res@gmail.com>
---
fs/f2fs/recovery.c | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/fs/f2fs/recovery.c b/fs/f2fs/recovery.c
index aaa5227..e40f66f 100644
--- a/fs/f2fs/recovery.c
+++ b/fs/f2fs/recovery.c
@@ -209,6 +209,13 @@ static int recover_dentry(struct inode *inode, struct folio *ifolio,
}
dir = entry->inode;
+ if (!S_ISDIR(dir->i_mode)) {
+ f2fs_err(F2FS_I_SB(inode),
+ "%s: ino %u is not a directory", __func__, pino);
+ set_sbi_flag(F2FS_I_SB(inode), SBI_NEED_FSCK);
+ err = -EFSCORRUPTED;
+ goto out;
+ }
err = init_recovered_filename(dir, inode, raw_inode, &fname, &usr_fname);
if (err)
goto out;
--
2.34.1
_______________________________________________
Linux-f2fs-devel mailing list
Linux-f2fs-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel
next prev parent reply other threads:[~2026-10-25 18:02 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-10-25 18:02 [f2fs-dev] [PATCH 0/3] f2fs: fix dentry recovery and MAIN_AREA validation Cheng Yongkang
2026-10-25 18:02 ` Cheng Yongkang [this message]
2026-10-25 18:02 ` [f2fs-dev] [PATCH 2/3] f2fs: reject MAIN_AREA boundary underflow Cheng Yongkang
2026-10-25 18:02 ` [f2fs-dev] [PATCH 3/3] f2fs: refresh superblock CRC after MAIN_AREA alignment fix Cheng Yongkang
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20261025180207.348498-2-teel4res@gmail.com \
--to=teel4res@gmail.com \
--cc=chao@kernel.org \
--cc=jaegeuk@kernel.org \
--cc=linux-f2fs-devel@lists.sourceforge.net \
--cc=linux-kernel@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.