aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/vhost/vhost.c
diff options
context:
space:
mode:
authorMichael S. Tsirkin <mst@redhat.com>2019-09-08 07:04:08 -0400
committerMichael S. Tsirkin <mst@redhat.com>2019-09-11 15:15:07 -0400
commita89db445fbd7f1f8457b03759aa7343fa530ef6b (patch)
tree83af9e5972b7bc3aef8f075fe6be4022b75c4d54 /drivers/vhost/vhost.c
parentcf8f1696709ad5bb3138ed8c771c2eb98950cd8a (diff)
vhost: block speculation of translated descriptors
iovec addresses coming from vhost are assumed to be pre-validated, but in fact can be speculated to a value out of range. Userspace address are later validated with array_index_nospec so we can be sure kernel info does not leak through these addresses, but vhost must also not leak userspace info outside the allowed memory table to guests. Following the defence in depth principle, make sure the address is not validated out of node range. Signed-off-by: Michael S. Tsirkin <mst@redhat.com> Cc: stable@vger.kernel.org Acked-by: Jason Wang <jasowang@redhat.com> Tested-by: Jason Wang <jasowang@redhat.com>
Diffstat (limited to 'drivers/vhost/vhost.c')
-rw-r--r--drivers/vhost/vhost.c6
1 files changed, 4 insertions, 2 deletions
diff --git a/drivers/vhost/vhost.c b/drivers/vhost/vhost.c
index 5dc174ac8cac..34ea219936e3 100644
--- a/drivers/vhost/vhost.c
+++ b/drivers/vhost/vhost.c
@@ -2071,8 +2071,10 @@ static int translate_desc(struct vhost_virtqueue *vq, u64 addr, u32 len,
2071 _iov = iov + ret; 2071 _iov = iov + ret;
2072 size = node->size - addr + node->start; 2072 size = node->size - addr + node->start;
2073 _iov->iov_len = min((u64)len - s, size); 2073 _iov->iov_len = min((u64)len - s, size);
2074 _iov->iov_base = (void __user *)(unsigned long) 2074 _iov->iov_base = (void __user *)
2075 (node->userspace_addr + addr - node->start); 2075 ((unsigned long)node->userspace_addr +
2076 array_index_nospec((unsigned long)(addr - node->start),
2077 node->size));
2076 s += size; 2078 s += size;
2077 addr += size; 2079 addr += size;
2078 ++ret; 2080 ++ret;