android_kernel_oneplus_msm8998/fs/ceph
Luis Henriques 2c5e0e6050 ceph: fix use-after-free in __ceph_remove_cap()
commit ea60ed6fcf29eebc78f2ce91491e6309ee005a01 upstream.

KASAN reports a use-after-free when running xfstest generic/531, with the
following trace:

[  293.903362]  kasan_report+0xe/0x20
[  293.903365]  rb_erase+0x1f/0x790
[  293.903370]  __ceph_remove_cap+0x201/0x370
[  293.903375]  __ceph_remove_caps+0x4b/0x70
[  293.903380]  ceph_evict_inode+0x4e/0x360
[  293.903386]  evict+0x169/0x290
[  293.903390]  __dentry_kill+0x16f/0x250
[  293.903394]  dput+0x1c6/0x440
[  293.903398]  __fput+0x184/0x330
[  293.903404]  task_work_run+0xb9/0xe0
[  293.903410]  exit_to_usermode_loop+0xd3/0xe0
[  293.903413]  do_syscall_64+0x1a0/0x1c0
[  293.903417]  entry_SYSCALL_64_after_hwframe+0x44/0xa9

This happens because __ceph_remove_cap() may queue a cap release
(__ceph_queue_cap_release) which can be scheduled before that cap is
removed from the inode list with

	rb_erase(&cap->ci_node, &ci->i_caps);

And, when this finally happens, the use-after-free will occur.

This can be fixed by removing the cap from the inode list before being
removed from the session list, and thus eliminating the risk of an UAF.

Cc: stable@vger.kernel.org
Signed-off-by: Luis Henriques <lhenriques@suse.com>
Reviewed-by: Jeff Layton <jlayton@kernel.org>
Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2019-11-12 19:13:20 +01:00
..
acl.c ceph: fix recursion between ceph_set_acl() and __ceph_setattr() 2017-05-25 14:30:13 +02:00
addr.c ceph: fix readpage from fscache 2017-09-07 08:34:09 +02:00
cache.c ceph: fix readpage from fscache 2017-09-07 08:34:09 +02:00
cache.h
caps.c ceph: fix use-after-free in __ceph_remove_cap() 2019-11-12 19:13:20 +01:00
ceph_frag.c
debugfs.c VFS: normal filesystems (and lustre): d_inode() annotations 2015-04-15 15:06:57 -04:00
dir.c ceph: ensure d_name stability in ceph_dentry_hash() 2019-05-16 19:44:43 +02:00
export.c VFS: normal filesystems (and lustre): d_inode() annotations 2015-04-15 15:06:57 -04:00
file.c ceph: fix error handling in ceph_read_iter 2016-10-28 03:01:35 -04:00
inode.c ceph: fix directories inode i_blkbits initialization 2019-10-17 13:40:55 -07:00
ioctl.c ceph: fix divide-by-zero in __validate_layout() 2014-10-14 12:57:05 -07:00
ioctl.h
Kconfig
locks.c Move locks API users to locks_lock_inode_wait() 2015-10-22 14:57:36 -04:00
Makefile
mds_client.c ceph: fix ci->i_head_snapc leak 2019-05-16 19:44:43 +02:00
mds_client.h ceph: make fsync() wait unsafe requests that created/modified inode 2015-11-02 23:36:48 +01:00
mdsmap.c
snap.c ceph: fix ci->i_head_snapc leak 2019-05-16 19:44:43 +02:00
strings.c ceph: rename snapshot support 2015-04-22 18:33:41 +03:00
super.c ceph: flush dirty inodes before proceeding with remount 2019-06-11 12:23:46 +02:00
super.h ceph: fix improper use of smp_mb__before_atomic() 2019-08-06 18:28:26 +02:00
xattr.c ceph: fix buffer free while holding i_ceph_lock in __ceph_setxattr() 2019-09-10 10:29:48 +01:00