[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH v4 9/9] virtio: handle virtqueue_get_head() errors
From: |
Stefan Hajnoczi |
Subject: |
[Qemu-devel] [PATCH v4 9/9] virtio: handle virtqueue_get_head() errors |
Date: |
Tue, 20 Sep 2016 15:49:38 +0100 |
Stop processing the vring if virtqueue_get_head() fetches an
out-of-bounds head index.
Signed-off-by: Stefan Hajnoczi <address@hidden>
---
hw/virtio/virtio.c | 27 +++++++++++++++++----------
1 file changed, 17 insertions(+), 10 deletions(-)
diff --git a/hw/virtio/virtio.c b/hw/virtio/virtio.c
index 6635ce4..21adf41 100644
--- a/hw/virtio/virtio.c
+++ b/hw/virtio/virtio.c
@@ -360,21 +360,20 @@ static int virtqueue_num_heads(VirtQueue *vq, unsigned
int idx)
return num_heads;
}
-static unsigned int virtqueue_get_head(VirtQueue *vq, unsigned int idx)
+static bool virtqueue_get_head(VirtQueue *vq, unsigned int idx,
+ unsigned int *head)
{
- unsigned int head;
-
/* Grab the next descriptor number they're advertising, and increment
* the index we've seen. */
- head = vring_avail_ring(vq, idx % vq->vring.num);
+ *head = vring_avail_ring(vq, idx % vq->vring.num);
/* If their number is silly, that's a fatal mistake. */
- if (head >= vq->vring.num) {
- error_report("Guest says index %u is available", head);
- exit(1);
+ if (*head >= vq->vring.num) {
+ virtio_error(vq->vdev, "Guest says index %u is available", *head);
+ return false;
}
- return head;
+ return true;
}
enum {
@@ -426,7 +425,11 @@ void virtqueue_get_avail_bytes(VirtQueue *vq, unsigned int
*in_bytes,
max = vq->vring.num;
num_bufs = total_bufs;
- i = virtqueue_get_head(vq, idx++);
+
+ if (!virtqueue_get_head(vq, idx++, &i)) {
+ goto err;
+ }
+
desc_pa = vq->vring.desc;
vring_desc_read(vdev, &desc, desc_pa, i);
@@ -655,11 +658,15 @@ void *virtqueue_pop(VirtQueue *vq, size_t sz)
return NULL;
}
- i = head = virtqueue_get_head(vq, vq->last_avail_idx++);
+ if (!virtqueue_get_head(vq, vq->last_avail_idx++, &head)) {
+ return NULL;
+ }
+
if (virtio_vdev_has_feature(vdev, VIRTIO_RING_F_EVENT_IDX)) {
vring_set_avail_event(vq, vq->last_avail_idx);
}
+ i = head;
vring_desc_read(vdev, &desc, desc_pa, i);
if (desc.flags & VRING_DESC_F_INDIRECT) {
if (desc.len % sizeof(VRingDesc)) {
--
2.7.4
- [Qemu-devel] [PATCH v4 1/9] virtio: fix stray tab character, (continued)
- [Qemu-devel] [PATCH v4 1/9] virtio: fix stray tab character, Stefan Hajnoczi, 2016/09/20
- [Qemu-devel] [PATCH v4 2/9] virtio: stop virtqueue processing if device is broken, Stefan Hajnoczi, 2016/09/20
- [Qemu-devel] [PATCH v4 3/9] virtio: migrate vdev->broken flag, Stefan Hajnoczi, 2016/09/20
- [Qemu-devel] [PATCH v4 4/9] virtio: handle virtqueue_map_desc() errors, Stefan Hajnoczi, 2016/09/20
- [Qemu-devel] [PATCH v4 6/9] virtio: use unsigned int for virtqueue_get_avail_bytes() index, Stefan Hajnoczi, 2016/09/20
- [Qemu-devel] [PATCH v4 7/9] virtio: handle virtqueue_read_next_desc() errors, Stefan Hajnoczi, 2016/09/20
- [Qemu-devel] [PATCH v4 5/9] virtio: handle virtqueue_get_avail_bytes() errors, Stefan Hajnoczi, 2016/09/20
- [Qemu-devel] [PATCH v4 8/9] virtio: handle virtqueue_num_heads() errors, Stefan Hajnoczi, 2016/09/20
- [Qemu-devel] [PATCH v4 9/9] virtio: handle virtqueue_get_head() errors,
Stefan Hajnoczi <=
- Re: [Qemu-devel] [PATCH v4 0/9] virtio: avoid exit() when device enters invalid states, Cornelia Huck, 2016/09/21