linux-stable/fs/f2fs
Chao Yu 35ac00c532 f2fs: fix to clear dirty inode in error path of f2fs_iget()
[ Upstream commit 546d22f070 ]

As Jungyeon reported in bugzilla:

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

- Overview
When mounting the attached crafted image and running program, I got this error.
Additionally, it hangs on sync after running the program.

The image is intentionally fuzzed from a normal f2fs image for testing and I enabled option CONFIG_F2FS_CHECK_FS on.

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

- Messages
 kernel BUG at fs/f2fs/inode.c:707!
 RIP: 0010:f2fs_evict_inode+0x33f/0x3a0
 Call Trace:
  evict+0xba/0x180
  f2fs_iget+0x598/0xdf0
  f2fs_lookup+0x136/0x320
  __lookup_slow+0x92/0x140
  lookup_slow+0x30/0x50
  walk_component+0x1c1/0x350
  path_lookupat+0x62/0x200
  filename_lookup+0xb3/0x1a0
  do_readlinkat+0x56/0x110
  __x64_sys_readlink+0x16/0x20
  do_syscall_64+0x43/0xf0
  entry_SYSCALL_64_after_hwframe+0x44/0xa9

During inode loading, __recover_inline_status() can recovery inode status
and set inode dirty, once we failed in following process, it will fail
the check in f2fs_evict_inode, result in trigger BUG_ON().

Let's clear dirty inode in error path of f2fs_iget() to avoid panic.

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
..
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 use of number of devices 2019-05-31 06:47:10 -07: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
Kconfig
Makefile License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01: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 with block address in main area 2018-12-05 19:41:16 +01: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