Skip to content

Commit

Permalink
vhost: fix error path in vhost_init_used()
Browse files Browse the repository at this point in the history
We don't want side effects. If something fails, we rollback vq->is_le to
its previous value.

Signed-off-by: Greg Kurz <gkurz@linux.vnet.ibm.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
  • Loading branch information
Greg Kurz authored and Michael S. Tsirkin committed Mar 2, 2016
1 parent 4e94ebd commit e1f33be
Showing 1 changed file with 11 additions and 4 deletions.
15 changes: 11 additions & 4 deletions drivers/vhost/vhost.c
Original file line number Diff line number Diff line change
Expand Up @@ -1156,6 +1156,8 @@ int vhost_init_used(struct vhost_virtqueue *vq)
{
__virtio16 last_used_idx;
int r;
bool is_le = vq->is_le;

if (!vq->private_data) {
vq->is_le = virtio_legacy_is_little_endian();
return 0;
Expand All @@ -1165,15 +1167,20 @@ int vhost_init_used(struct vhost_virtqueue *vq)

r = vhost_update_used_flags(vq);
if (r)
return r;
goto err;
vq->signalled_used_valid = false;
if (!access_ok(VERIFY_READ, &vq->used->idx, sizeof vq->used->idx))
return -EFAULT;
if (!access_ok(VERIFY_READ, &vq->used->idx, sizeof vq->used->idx)) {
r = -EFAULT;
goto err;
}
r = __get_user(last_used_idx, &vq->used->idx);
if (r)
return r;
goto err;
vq->last_used_idx = vhost16_to_cpu(vq, last_used_idx);
return 0;
err:
vq->is_le = is_le;
return r;
}
EXPORT_SYMBOL_GPL(vhost_init_used);

Expand Down

0 comments on commit e1f33be

Please sign in to comment.