ceph: avoid use-after-free in ceph_fl_release_lock()
authorXiubo Li <xiubli@redhat.com>
Thu, 17 Nov 2022 02:57:53 +0000 (10:57 +0800)
committerIlya Dryomov <idryomov@gmail.com>
Mon, 2 Jan 2023 11:27:25 +0000 (12:27 +0100)
commit8e1858710d9a71d88acd922f2e95d1eddb90eea0
tree478a0dfc7713b89e895ea5ac7e8ed5020b782107
parent461ab10ef7e6ea9b41a0571a7fc6a72af9549a3c
ceph: avoid use-after-free in ceph_fl_release_lock()

When ceph releasing the file_lock it will try to get the inode pointer
from the fl->fl_file, which the memory could already be released by
another thread in filp_close(). Because in VFS layer the fl->fl_file
doesn't increase the file's reference counter.

Will switch to use ceph dedicate lock info to track the inode.

And in ceph_fl_release_lock() we should skip all the operations if the
fl->fl_u.ceph.inode is not set, which should come from the request
file_lock. And we will set fl->fl_u.ceph.inode when inserting it to the
inode lock list, which is when copying the lock.

Link: https://tracker.ceph.com/issues/57986
Signed-off-by: Xiubo Li <xiubli@redhat.com>
Reviewed-by: Jeff Layton <jlayton@kernel.org>
Reviewed-by: Ilya Dryomov <idryomov@gmail.com>
Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
fs/ceph/locks.c
include/linux/fs.h