Skip to content

Commit cf4a9e1

Browse files
chaseyugregkh
authored andcommitted
f2fs: fix to avoid UAF in f2fs_write_end_io()
[ Upstream commit ce2739e ] As syzbot reported an use-after-free issue in f2fs_write_end_io(). It is caused by below race condition: loop device umount - worker_thread - loop_process_work - do_req_filebacked - lo_rw_aio - lo_rw_aio_complete - blk_mq_end_request - blk_update_request - f2fs_write_end_io - dec_page_count - folio_end_writeback - kill_f2fs_super - kill_block_super - f2fs_put_super : free(sbi) : get_pages(, F2FS_WB_CP_DATA) accessed sbi which is freed In kill_f2fs_super(), we will drop all page caches of f2fs inodes before call free(sbi), it guarantee that all folios should end its writeback, so it should be safe to access sbi before last folio_end_writeback(). Let's relocate ckpt thread wakeup flow before folio_end_writeback() to resolve this issue. Cc: stable@kernel.org Fixes: e234088 ("f2fs: avoid wait if IO end up when do_checkpoint for better performance") Reported-by: syzbot+b4444e3c972a7a124187@syzkaller.appspotmail.com Closes: https://syzkaller.appspot.com/bug?extid=b4444e3c972a7a124187 Signed-off-by: Chao Yu <chao@kernel.org> Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org> [ folio => page ] Signed-off-by: Sasha Levin <sashal@kernel.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
1 parent 121f787 commit cf4a9e1

1 file changed

Lines changed: 9 additions & 3 deletions

File tree

fs/f2fs/data.c

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -357,14 +357,20 @@ static void f2fs_write_end_io(struct bio *bio)
357357
page_folio(page)->index != nid_of_node(page));
358358

359359
dec_page_count(sbi, type);
360+
361+
/*
362+
* we should access sbi before end_page_writeback() to
363+
* avoid racing w/ kill_f2fs_super()
364+
*/
365+
if (type == F2FS_WB_CP_DATA && !get_pages(sbi, type) &&
366+
wq_has_sleeper(&sbi->cp_wait))
367+
wake_up(&sbi->cp_wait);
368+
360369
if (f2fs_in_warm_node_list(sbi, page))
361370
f2fs_del_fsync_node_entry(sbi, page);
362371
clear_page_private_gcing(page);
363372
end_page_writeback(page);
364373
}
365-
if (!get_pages(sbi, F2FS_WB_CP_DATA) &&
366-
wq_has_sleeper(&sbi->cp_wait))
367-
wake_up(&sbi->cp_wait);
368374

369375
bio_put(bio);
370376
}

0 commit comments

Comments
 (0)