vhost: reset metadata cache when initializing new IOTLB

We need to reset metadata cache during new IOTLB initialization,
otherwise the stale pointers to previous IOTLB may be still accessed
which will lead a use after free.

Reported-by: syzbot+c51e6736a1bf614b3272@syzkaller.appspotmail.com
Fixes: f889491380 ("vhost: introduce O(1) vq metadata cache")
Signed-off-by: Jason Wang <jasowang@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Jason Wang 2018-08-08 11:43:04 +08:00 коммит произвёл David S. Miller
Родитель 0dcb82254d
Коммит b13f9c6364
1 изменённых файлов: 6 добавлений и 3 удалений

Просмотреть файл

@ -1560,9 +1560,12 @@ int vhost_init_device_iotlb(struct vhost_dev *d, bool enabled)
d->iotlb = niotlb; d->iotlb = niotlb;
for (i = 0; i < d->nvqs; ++i) { for (i = 0; i < d->nvqs; ++i) {
mutex_lock(&d->vqs[i]->mutex); struct vhost_virtqueue *vq = d->vqs[i];
d->vqs[i]->iotlb = niotlb;
mutex_unlock(&d->vqs[i]->mutex); mutex_lock(&vq->mutex);
vq->iotlb = niotlb;
__vhost_vq_meta_reset(vq);
mutex_unlock(&vq->mutex);
} }
vhost_umem_clean(oiotlb); vhost_umem_clean(oiotlb);