mirror of https://gitee.com/openkylin/linux.git
ceph: do not access the kiocb after aio requests
In aio case, if the completion comes very fast just before the ceph_read_iter() returns to fs/aio.c, the kiocb will be freed in the completion callback, then if ceph_read_iter() access again we will potentially hit the use-after-free bug. [ jlayton: initialize direct_lock early, and use it everywhere ] URL: https://tracker.ceph.com/issues/45649 Signed-off-by: Xiubo Li <xiubli@redhat.com> Signed-off-by: Jeff Layton <jlayton@kernel.org> Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
This commit is contained in:
parent
585d72f33e
commit
d1d9655052
|
@ -1538,6 +1538,7 @@ static ssize_t ceph_read_iter(struct kiocb *iocb, struct iov_iter *to)
|
|||
struct inode *inode = file_inode(filp);
|
||||
struct ceph_inode_info *ci = ceph_inode(inode);
|
||||
struct page *pinned_page = NULL;
|
||||
bool direct_lock = iocb->ki_flags & IOCB_DIRECT;
|
||||
ssize_t ret;
|
||||
int want, got = 0;
|
||||
int retry_op = 0, read = 0;
|
||||
|
@ -1546,7 +1547,7 @@ static ssize_t ceph_read_iter(struct kiocb *iocb, struct iov_iter *to)
|
|||
dout("aio_read %p %llx.%llx %llu~%u trying to get caps on %p\n",
|
||||
inode, ceph_vinop(inode), iocb->ki_pos, (unsigned)len, inode);
|
||||
|
||||
if (iocb->ki_flags & IOCB_DIRECT)
|
||||
if (direct_lock)
|
||||
ceph_start_io_direct(inode);
|
||||
else
|
||||
ceph_start_io_read(inode);
|
||||
|
@ -1603,7 +1604,7 @@ static ssize_t ceph_read_iter(struct kiocb *iocb, struct iov_iter *to)
|
|||
}
|
||||
ceph_put_cap_refs(ci, got);
|
||||
|
||||
if (iocb->ki_flags & IOCB_DIRECT)
|
||||
if (direct_lock)
|
||||
ceph_end_io_direct(inode);
|
||||
else
|
||||
ceph_end_io_read(inode);
|
||||
|
|
Loading…
Reference in New Issue