linux-stable/fs/f2fs
Chao Yu 88dedecc24 f2fs: fix to do sanity check on last xattr entry in __f2fs_setxattr()
commit 5598b24efaf4892741c798b425d543e4bed357a1 upstream.

As Wenqing Liu reported in bugzilla:

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

- Overview
page fault in f2fs_setxattr() when mount and operate on corrupted image

- Reproduce
tested on kernel 5.16-rc3, 5.15.X under root

1. unzip tmp7.zip
2. ./single.sh f2fs 7

Sometimes need to run the script several times

- Kernel dump
loop0: detected capacity change from 0 to 131072
F2FS-fs (loop0): Found nat_bits in checkpoint
F2FS-fs (loop0): Mounted with checkpoint version = 7548c2ee
BUG: unable to handle page fault for address: ffffe47bc7123f48
RIP: 0010:kfree+0x66/0x320
Call Trace:
 __f2fs_setxattr+0x2aa/0xc00 [f2fs]
 f2fs_setxattr+0xfa/0x480 [f2fs]
 __f2fs_set_acl+0x19b/0x330 [f2fs]
 __vfs_removexattr+0x52/0x70
 __vfs_removexattr_locked+0xb1/0x140
 vfs_removexattr+0x56/0x100
 removexattr+0x57/0x80
 path_removexattr+0xa3/0xc0
 __x64_sys_removexattr+0x17/0x20
 do_syscall_64+0x37/0xb0
 entry_SYSCALL_64_after_hwframe+0x44/0xae

The root cause is in __f2fs_setxattr(), we missed to do sanity check on
last xattr entry, result in out-of-bound memory access during updating
inconsistent xattr data of target inode.

After the fix, it can detect such xattr inconsistency as below:

F2FS-fs (loop11): inode (7) has invalid last xattr entry, entry_size: 60676
F2FS-fs (loop11): inode (8) has corrupted xattr
F2FS-fs (loop11): inode (8) has corrupted xattr
F2FS-fs (loop11): inode (8) has invalid last xattr entry, entry_size: 47736

Cc: stable@vger.kernel.org
Reported-by: Wenqing Liu <wenqingliu0120@gmail.com>
Signed-off-by: Chao Yu <chao@kernel.org>
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
[delete f2fs_err() call as it's not in older kernels - gregkh]
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2021-12-29 12:17:36 +01:00
..
acl.c f2fs: fix wrong return value of f2fs_acl_create 2019-02-12 19:46:00 +01:00
acl.h
checkpoint.c f2fs: fix to check segment boundary during SIT page readahead 2020-11-05 11:06:53 +01:00
data.c f2fs: fix potential overflow 2020-01-17 19:45:52 +01:00
debug.c f2fs: show available_nids in f2fs/status 2017-05-03 10:04:57 -07:00
dir.c f2fs: check if file namelen exceeds max value 2020-08-05 10:06:49 +02: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: use generic EFSBADCRC/EFSCORRUPTED 2019-10-05 12:47:39 +02:00
file.c f2fs: fix out-of-repair __setattr_copy() 2021-03-03 18:22:55 +01:00
gc.c f2fs: fix to allow node segment for GC by ioctl path 2019-12-17 20:38:12 +01: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 a redundant call to f2fs_balance_fs if an error occurs 2021-05-22 10:57:38 +02:00
inode.c f2fs: use generic EFSBADCRC/EFSCORRUPTED 2019-10-05 12:47:39 +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 fscrypt: return -EXDEV for incompatible rename or link into encrypted dir 2020-11-05 11:06:52 +01:00
node.c f2fs: fix indefinite loop scanning for free nid 2020-09-23 10:46:34 +02:00
node.h f2fs: simplify the way of calulating next nat address 2017-07-04 02:11:34 -07:00
recovery.c f2fs: mark inode dirty explicitly in recover_inode() 2019-11-20 18:00:45 +01:00
segment.c f2fs: fix potential overflow 2021-09-22 11:45:15 +02:00
segment.h f2fs: handle unallocated section and zone on pinned/atgc 2021-03-07 11:27:45 +01:00
shrinker.c f2fs: fix sbi->extent_list corruption issue 2019-02-12 19:46:08 +01:00
super.c f2fs: add MODULE_SOFTDEP to ensure crc32 is included in the initramfs 2021-07-20 16:17:53 +02:00
sysfs.c f2fs: wait for sysfs kobject removal before freeing f2fs_sb_info 2020-10-29 09:07:10 +01: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: fix to do sanity check on last xattr entry in __f2fs_setxattr() 2021-12-29 12:17:36 +01:00
xattr.h f2fs: fix to avoid accessing xattr across the boundary 2020-05-20 08:17:04 +02:00