WSL2-Linux-Kernel/fs/f2fs
Chao Yu c32e6a51b9 f2fs: fix to do sanity check on valid block count of segment
[ Upstream commit e95bcdb2fe ]

As Jungyeon reported in bugzilla:

https://bugzilla.kernel.org/show_bug.cgi?id=203233

- Overview
When mounting the attached crafted image and running program, following errors are reported.
Additionally, it hangs on sync after running program.

The image is intentionally fuzzed from a normal f2fs image for testing.
Compile options for F2FS are as follows.
CONFIG_F2FS_FS=y
CONFIG_F2FS_STAT_FS=y
CONFIG_F2FS_FS_XATTR=y
CONFIG_F2FS_FS_POSIX_ACL=y
CONFIG_F2FS_CHECK_FS=y

- Reproduces
cc poc_13.c
mkdir test
mount -t f2fs tmp.img test
cp a.out test
cd test
sudo ./a.out
sync

- Kernel messages
 F2FS-fs (sdb): Bitmap was wrongly set, blk:4608
 kernel BUG at fs/f2fs/segment.c:2102!
 RIP: 0010:update_sit_entry+0x394/0x410
 Call Trace:
  f2fs_allocate_data_block+0x16f/0x660
  do_write_page+0x62/0x170
  f2fs_do_write_node_page+0x33/0xa0
  __write_node_page+0x270/0x4e0
  f2fs_sync_node_pages+0x5df/0x670
  f2fs_write_checkpoint+0x372/0x1400
  f2fs_sync_fs+0xa3/0x130
  f2fs_do_sync_file+0x1a6/0x810
  do_fsync+0x33/0x60
  __x64_sys_fsync+0xb/0x10
  do_syscall_64+0x43/0xf0
  entry_SYSCALL_64_after_hwframe+0x44/0xa9

sit.vblocks and sum valid block count in sit.valid_map may be
inconsistent, segment w/ zero vblocks will be treated as free
segment, while allocating in free segment, we may allocate a
free block, if its bitmap is valid previously, it can cause
kernel crash due to bitmap verification failure.

Anyway, to avoid further serious metadata inconsistence and
corruption, it is necessary and worth to detect SIT
inconsistence. So let's enable check_block_count() to verify
vblocks and valid_map all the time rather than do it only
CONFIG_F2FS_CHECK_FS is enabled.

Signed-off-by: Chao Yu <yuchao0@huawei.com>
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
2019-06-15 11:54:53 +02:00
..
Kconfig
Makefile License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
acl.c f2fs: fix wrong return value of f2fs_acl_create 2019-02-12 19:46:00 +01:00
acl.h f2fs: remove dead code f2fs_check_acl 2016-09-14 16:52:36 -07:00
checkpoint.c f2fs: fix to do sanity check with cp_pack_start_sum 2018-12-05 19:41:16 +01:00
data.c f2fs: Fix use of number of devices 2019-05-31 06:47:10 -07:00
debug.c f2fs: show available_nids in f2fs/status 2017-05-03 10:04:57 -07:00
dir.c f2fs: clear radix tree dirty tag of pages whose dirty flag is cleared 2017-09-11 21:32:38 -07:00
extent_cache.c f2fs: fix to check extent cache in f2fs_drop_extent_tree 2018-05-30 07:52:33 +02:00
f2fs.h f2fs: fix to avoid panic in dec_valid_block_count() 2019-06-15 11:54:53 +02:00
file.c f2fs: Fix use of number of devices 2019-05-31 06:47:10 -07:00
gc.c f2fs: Fix use of number of devices 2019-05-31 06:47:10 -07:00
gc.h f2fs: fix potential overflow when adjusting GC cycle 2017-08-15 10:40:14 -07:00
hash.c f2fs: check entire encrypted bigname when finding a dentry 2017-05-04 11:44:35 -04:00
inline.c f2fs: fix to avoid deadlock in f2fs_read_inline_dir() 2019-04-05 22:31:25 +02:00
inode.c f2fs: fix to clear dirty inode in error path of f2fs_iget() 2019-06-15 11:54:53 +02:00
namei.c do d_instantiate/unlock_new_inode combinations safely 2018-05-30 07:51:47 +02:00
node.c f2fs: read page index before freeing 2019-01-31 08:13:48 +01:00
node.h f2fs: simplify the way of calulating next nat address 2017-07-04 02:11:34 -07:00
recovery.c f2fs: fix to avoid panic in do_recover_data() 2019-06-15 11:54:53 +02:00
segment.c f2fs: Fix use of number of devices 2019-05-31 06:47:10 -07:00
segment.h f2fs: fix to do sanity check on valid block count of segment 2019-06-15 11:54:53 +02:00
shrinker.c f2fs: fix sbi->extent_list corruption issue 2019-02-12 19:46:08 +01:00
super.c f2fs: fix to do sanity check with current segment number 2019-04-20 09:15:04 +02:00
sysfs.c f2fs: fix defined but not used build warnings 2018-09-19 22:43:40 +02:00
trace.c f2fs: do not use mutex lock in atomic context 2019-04-05 22:31:27 +02:00
trace.h
xattr.c f2fs: avoid race in between read xattr & write xattr 2017-09-07 20:57:20 -07:00
xattr.h f2fs: guard macro variables with braces 2017-04-10 19:48:10 -07:00