WSL2-Linux-Kernel/fs
Gao Xiang 8ddd001cef erofs: fix pcluster use-after-free on UP platforms
[ Upstream commit 2f44013e39 ]

During stress testing with CONFIG_SMP disabled, KASAN reports as below:

==================================================================
BUG: KASAN: use-after-free in __mutex_lock+0xe5/0xc30
Read of size 8 at addr ffff8881094223f8 by task stress/7789

CPU: 0 PID: 7789 Comm: stress Not tainted 6.0.0-rc1-00002-g0d53d2e882f9 #3
Hardware name: Red Hat KVM, BIOS 0.5.1 01/01/2011
Call Trace:
 <TASK>
..
 __mutex_lock+0xe5/0xc30
..
 z_erofs_do_read_page+0x8ce/0x1560
..
 z_erofs_readahead+0x31c/0x580
..
Freed by task 7787
 kasan_save_stack+0x1e/0x40
 kasan_set_track+0x20/0x30
 kasan_set_free_info+0x20/0x40
 __kasan_slab_free+0x10c/0x190
 kmem_cache_free+0xed/0x380
 rcu_core+0x3d5/0xc90
 __do_softirq+0x12d/0x389

Last potentially related work creation:
 kasan_save_stack+0x1e/0x40
 __kasan_record_aux_stack+0x97/0xb0
 call_rcu+0x3d/0x3f0
 erofs_shrink_workstation+0x11f/0x210
 erofs_shrink_scan+0xdc/0x170
 shrink_slab.constprop.0+0x296/0x530
 drop_slab+0x1c/0x70
 drop_caches_sysctl_handler+0x70/0x80
 proc_sys_call_handler+0x20a/0x2f0
 vfs_write+0x555/0x6c0
 ksys_write+0xbe/0x160
 do_syscall_64+0x3b/0x90

The root cause is that erofs_workgroup_unfreeze() doesn't reset to
orig_val thus it causes a race that the pcluster reuses unexpectedly
before freeing.

Since UP platforms are quite rare now, such path becomes unnecessary.
Let's drop such specific-designed path directly instead.

Fixes: 73f5c66df3 ("staging: erofs: fix `erofs_workgroup_{try_to_freeze, unfreeze}'")
Reviewed-by: Yue Hu <huyue2@coolpad.com>
Reviewed-by: Chao Yu <chao@kernel.org>
Link: https://lore.kernel.org/r/20220902045710.109530-1-hsiangkao@linux.alibaba.com
Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
2022-09-15 11:30:06 +02:00
..
9p 9p: fix a bunch of checkpatch warnings 2022-08-17 14:24:07 +02:00
adfs
affs
afs afs: Use the operation issue time instead of the reply time for callbacks 2022-09-15 11:30:05 +02:00
autofs
befs
bfs
btrfs btrfs: zoned: set pseudo max append zone limit in zone emulation mode 2022-09-15 11:30:02 +02:00
cachefiles fs: add is_idmapped_mnt() helper 2022-07-02 16:41:14 +02:00
ceph ceph: don't leak snap_rwsem in handle_cap_grant 2022-08-25 11:40:13 +02:00
cifs cifs: fix small mempool leak in SMB2_negotiate() 2022-09-08 12:28:04 +02:00
coda
configfs
cramfs
crypto
debugfs debugfs: add debugfs_lookup_and_remove() 2022-09-15 11:30:02 +02:00
devpts
dlm dlm: fix pending remove if msg allocation fails 2022-07-29 17:25:24 +02:00
ecryptfs fs: add is_idmapped_mnt() helper 2022-07-02 16:41:14 +02:00
efivarfs
efs
erofs erofs: fix pcluster use-after-free on UP platforms 2022-09-15 11:30:06 +02:00
exfat exfat: use updated exfat_chain directly during renaming 2022-07-29 17:25:30 +02:00
exportfs exportfs: support idmapped mounts 2022-06-09 10:23:32 +02:00
ext2 ext2: Add more validity checks for inode counts 2022-08-17 14:23:00 +02:00
ext4 ext4: avoid resizing to a partial cluster size 2022-08-25 11:40:40 +02:00
f2fs f2fs: fix to do sanity check on segment type in build_sit_entries() 2022-08-25 11:40:45 +02:00
fat
freevxfs
fscache
fuse fuse: Remove the control interface for virtio-fs 2022-08-17 14:24:11 +02:00
gfs2 gfs2: Fix gfs2_file_buffered_write endless loop workaround 2022-07-12 16:34:59 +02:00
hfs
hfsplus
hostfs
hpfs
hugetlbfs
iomap
isofs
jbd2 jbd2: fix assertion 'jh->b_frozen_data == NULL' failure when journal aborted 2022-08-17 14:24:01 +02:00
jffs2 jffs2: fix memory leak in jffs2_do_fill_super 2022-06-14 18:36:10 +02:00
jfs
kernfs kernfs: Separate kernfs_pr_cont_buf and rename_lock. 2022-06-14 18:36:22 +02:00
ksmbd ksmbd: don't remove dos attribute xattr on O_TRUNC open 2022-09-05 10:30:11 +02:00
lockd lockd: detect and reject lock arguments that overflow 2022-08-17 14:22:47 +02:00
minix
netfs
nfs NFS: Fix another fsync() issue after a server reboot 2022-09-15 11:30:03 +02:00
nfs_common
nfsd nfsd: eliminate the NFSD_FILE_BREAK_* flags 2022-08-17 14:22:45 +02:00
nilfs2 nilfs2: fix incorrect masking of permission flags for symlinks 2022-07-21 21:24:14 +02:00
nls
notify
ntfs ntfs: fix use-after-free in ntfs_ucsncmp() 2022-08-03 12:03:41 +02:00
ntfs3 fs/ntfs3: Fix work with fragmented xattr 2022-09-05 10:30:10 +02:00
ocfs2 Revert "ocfs2: mount shared volume without ha stack" 2022-08-03 12:03:41 +02:00
omfs
openpromfs
orangefs
overlayfs ovl: warn if trusted xattr creation fails 2022-08-25 11:40:43 +02:00
proc mm/smaps: don't access young/dirty bit if pte unpresent 2022-08-31 17:16:37 +02:00
pstore
qnx4
qnx6
quota quota: Prevent memory allocation recursion while holding dq_lock 2022-06-22 14:21:56 +02:00
ramfs
reiserfs
romfs
smbfs_common
squashfs
sysfs
sysv
tracefs
ubifs
udf
ufs
unicode
vboxsf
verity
xfs xfs: reject crazy array sizes being fed to XFS_IOC_GETBMAP* 2022-08-25 11:40:48 +02:00
zonefs block: add a bdev_max_zone_append_sectors helper 2022-08-31 17:16:34 +02:00
Kconfig
Kconfig.binfmt
Makefile
aio.c
anon_inodes.c
attr.c vfs: Check the truncate maximum size in inode_newsize_ok() 2022-08-17 14:22:50 +02:00
bad_inode.c
binfmt_aout.c
binfmt_elf.c
binfmt_elf_fdpic.c
binfmt_flat.c
binfmt_misc.c
binfmt_script.c
buffer.c
char_dev.c
compat_binfmt_elf.c
coredump.c
d_path.c
dax.c
dcache.c
direct-io.c
drop_caches.c
eventfd.c
eventpoll.c epoll: autoremove wakers even more aggressively 2022-08-17 14:22:59 +02:00
exec.c posix-cpu-timers: Cleanup CPU timers before freeing them during exec 2022-08-17 14:24:19 +02:00
fcntl.c
fhandle.c
file.c
file_table.c
filesystems.c
fs-writeback.c writeback: avoid use-after-free after removing device 2022-08-31 17:16:47 +02:00
fs_context.c
fs_parser.c
fs_pin.c
fs_struct.c
fs_types.c
fsopen.c
init.c
inode.c writeback: Fix inode->i_io_list not be protected by inode->i_lock error 2022-06-14 18:36:26 +02:00
internal.h
io-wq.c
io-wq.h
io_uring.c io_uring: fix UAF due to missing POLLFREE handling 2022-09-05 10:30:06 +02:00
ioctl.c
kernel_read_file.c
libfs.c
locks.c
mbcache.c mbcache: add functions to delete entry if unused 2022-08-17 14:22:57 +02:00
mount.h
mpage.c
namei.c __follow_mount_rcu(): verify that mount_lock remains unchanged 2022-08-17 14:24:19 +02:00
namespace.c fs: require CAP_SYS_ADMIN in target namespace for idmapped mounts 2022-08-31 17:16:37 +02:00
no-block.c
nsfs.c
open.c fs: support mapped mounts of mapped filesystems 2022-07-02 16:41:17 +02:00
pipe.c
pnode.c
pnode.h
posix_acl.c fs: fix acl translation 2022-07-02 16:41:17 +02:00
proc_namespace.c fs: add is_idmapped_mnt() helper 2022-07-02 16:41:14 +02:00
read_write.c fs: sendfile handles O_NONBLOCK of out_fd 2022-08-03 12:03:41 +02:00
readdir.c
remap_range.c fs/remap: constrain dedupe of EOF blocks 2022-07-21 21:24:14 +02:00
select.c
seq_file.c rxrpc: Fix locking issue 2022-07-12 16:35:08 +02:00
signalfd.c
splice.c fs: check FMODE_LSEEK to control internal pipe splicing 2022-08-17 14:23:31 +02:00
stack.c
stat.c
statfs.c
super.c
sync.c
timerfd.c
userfaultfd.c
utimes.c
xattr.c fs: fix acl translation 2022-07-02 16:41:17 +02:00