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 ceph: fscache: add an interface to synchronize object store limit 2014-04-03 10:33:53 +08:00
caps.c ceph: fix use-after-free in __ceph_remove_cap() 2019-11-12 19:13:20 +01:00
ceph_frag.c ceph: factor out libceph from Ceph file system 2010-10-20 15:37:28 -07:00
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 ceph: fully initialize new layout 2012-05-16 14:28:27 -05:00
Kconfig ceph: add acl for cephfs 2013-12-31 20:32:01 +02:00
locks.c Move locks API users to locks_lock_inode_wait() 2015-10-22 14:57:36 -04:00
Makefile ceph: add acl for cephfs 2013-12-31 20:32:01 +02:00
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 fs/ceph: replace pr_warning by pr_warn 2014-06-06 16:08:06 -07:00
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