Skip to content

Commit d6b3fc3

Browse files
chaseyumehmetb0
authored andcommitted
f2fs: fix to do sanity check on F2FS_INLINE_DATA flag in inode during GC
[ Upstream commit fc01008 ] syzbot reports a f2fs bug as below: ------------[ cut here ]------------ kernel BUG at fs/f2fs/inline.c:258! CPU: 1 PID: 34 Comm: kworker/u8:2 Not tainted 6.9.0-rc6-syzkaller-00012-g9e4bc4bcae01 #0 RIP: 0010:f2fs_write_inline_data+0x781/0x790 fs/f2fs/inline.c:258 Call Trace: f2fs_write_single_data_page+0xb65/0x1d60 fs/f2fs/data.c:2834 f2fs_write_cache_pages fs/f2fs/data.c:3133 [inline] __f2fs_write_data_pages fs/f2fs/data.c:3288 [inline] f2fs_write_data_pages+0x1efe/0x3a90 fs/f2fs/data.c:3315 do_writepages+0x35b/0x870 mm/page-writeback.c:2612 __writeback_single_inode+0x165/0x10b0 fs/fs-writeback.c:1650 writeback_sb_inodes+0x905/0x1260 fs/fs-writeback.c:1941 wb_writeback+0x457/0xce0 fs/fs-writeback.c:2117 wb_do_writeback fs/fs-writeback.c:2264 [inline] wb_workfn+0x410/0x1090 fs/fs-writeback.c:2304 process_one_work kernel/workqueue.c:3254 [inline] process_scheduled_works+0xa12/0x17c0 kernel/workqueue.c:3335 worker_thread+0x86d/0xd70 kernel/workqueue.c:3416 kthread+0x2f2/0x390 kernel/kthread.c:388 ret_from_fork+0x4d/0x80 arch/x86/kernel/process.c:147 ret_from_fork_asm+0x1a/0x30 arch/x86/entry/entry_64.S:244 The root cause is: inline_data inode can be fuzzed, so that there may be valid blkaddr in its direct node, once f2fs triggers background GC to migrate the block, it will hit f2fs_bug_on() during dirty page writeback. Let's add sanity check on F2FS_INLINE_DATA flag in inode during GC, so that, it can forbid migrating inline_data inode's data block for fixing. Reported-by: [email protected] Closes: https://lore.kernel.org/linux-f2fs-devel/[email protected] Signed-off-by: Chao Yu <[email protected]> Signed-off-by: Jaegeuk Kim <[email protected]> Signed-off-by: Sasha Levin <[email protected]> (backported from commit ae00e6536a2dd54b64b39e9a39548870cf835745 linux-6.6.y) [mpellizzer: backported solving merge conflicts which do not affect the fix and using printk_ratelimited instead of f2fs_err_ratelimited, since the latter is not defined in focal/jammy] CVE-2024-44942 Signed-off-by: Massimiliano Pellizzer <[email protected]> Acked-by: Manuel Diewald <[email protected]> Acked-by: Guoqing Jiang <[email protected]> Signed-off-by: Roxana Nicolescu <[email protected]>
1 parent c0a577e commit d6b3fc3

File tree

1 file changed

+11
-0
lines changed

1 file changed

+11
-0
lines changed

fs/f2fs/gc.c

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1479,6 +1479,17 @@ static int gc_data_segment(struct f2fs_sb_info *sbi, struct f2fs_summary *sum,
14791479
special_file(inode->i_mode))
14801480
continue;
14811481

1482+
if (f2fs_has_inline_data(inode)) {
1483+
iput(inode);
1484+
set_sbi_flag(sbi, SBI_NEED_FSCK);
1485+
printk_ratelimited("%sF2FS-fs (%s): "
1486+
"inode %lx has both inline_data flag and "
1487+
"data block, nid=%u, ofs_in_node=%u",
1488+
KERN_ERR, sbi->sb->s_id,
1489+
inode->i_ino, dni.nid, ofs_in_node);
1490+
continue;
1491+
}
1492+
14821493
if (!down_write_trylock(
14831494
&F2FS_I(inode)->i_gc_rwsem[WRITE])) {
14841495
iput(inode);

0 commit comments

Comments
 (0)