diff mbox

[for,2.3,1/2] virtio-net: validate backend queue numbers against bus limitation

Message ID 1426748752-13385-1-git-send-email-jasowang@redhat.com
State New
Headers show

Commit Message

Jason Wang March 19, 2015, 7:05 a.m. UTC
We don't validate the backend queue numbers against bus limitation,
this will easily crash qemu if it exceeds the limitation. Fixing this
by doing the validation and fail early.

Cc: Michael S. Tsirkin <mst@redhat.com>
Cc: qemu-stable <qemu-stable@nongnu.org>
Signed-off-by: Jason Wang <jasowang@redhat.com>
---
 hw/net/virtio-net.c | 7 +++++++
 1 file changed, 7 insertions(+)

Comments

Michael S. Tsirkin March 19, 2015, 10:10 a.m. UTC | #1
On Thu, Mar 19, 2015 at 03:05:51PM +0800, Jason Wang wrote:
> We don't validate the backend queue numbers against bus limitation,
> this will easily crash qemu if it exceeds the limitation. Fixing this
> by doing the validation and fail early.

Can you please include the qemu command line that crashes?

> Cc: qemu-stable <qemu-stable@nongnu.org>
> Signed-off-by: Jason Wang <jasowang@redhat.com>
> ---
>  hw/net/virtio-net.c | 7 +++++++
>  1 file changed, 7 insertions(+)
> 
> diff --git a/hw/net/virtio-net.c b/hw/net/virtio-net.c
> index 27adcc5..59f76bc 100644
> --- a/hw/net/virtio-net.c
> +++ b/hw/net/virtio-net.c
> @@ -1588,6 +1588,13 @@ static void virtio_net_device_realize(DeviceState *dev, Error **errp)
>      virtio_init(vdev, "virtio-net", VIRTIO_ID_NET, n->config_size);
>  
>      n->max_queues = MAX(n->nic_conf.peers.queues, 1);
> +    if (n->max_queues * 2 + 1 > VIRTIO_PCI_QUEUE_MAX) {
> +        error_setg(errp, "Invalid number of queues (= %" PRIu32 "), "
> +                   "must be a postive integer less than %d.",
> +                   n->max_queues, (VIRTIO_PCI_QUEUE_MAX - 1) / 2);
> +        virtio_cleanup(vdev);
> +        return;
> +    }
>      n->vqs = g_malloc0(sizeof(VirtIONetQueue) * n->max_queues);
>      n->vqs[0].rx_vq = virtio_add_queue(vdev, 256, virtio_net_handle_rx);
>      n->curr_queues = 1;
> -- 
> 2.1.0
Jason Wang March 20, 2015, 5:52 a.m. UTC | #2
On Thu, Mar 19, 2015 at 6:10 PM, Michael S. Tsirkin <mst@redhat.com> 
wrote:
> On Thu, Mar 19, 2015 at 03:05:51PM +0800, Jason Wang wrote:
>>  We don't validate the backend queue numbers against bus limitation,
>>  this will easily crash qemu if it exceeds the limitation. Fixing 
>> this
>>  by doing the validation and fail early.
> 
> Can you please include the qemu command line that crashes?

Ok, will include it in v2. cli is something like:

qemu-system-x86_64 -netdev tap,id=hn0,queues=256 -device 
virtio-net-pci,netdev=hn0 -enable-kvm
diff mbox

Patch

diff --git a/hw/net/virtio-net.c b/hw/net/virtio-net.c
index 27adcc5..59f76bc 100644
--- a/hw/net/virtio-net.c
+++ b/hw/net/virtio-net.c
@@ -1588,6 +1588,13 @@  static void virtio_net_device_realize(DeviceState *dev, Error **errp)
     virtio_init(vdev, "virtio-net", VIRTIO_ID_NET, n->config_size);
 
     n->max_queues = MAX(n->nic_conf.peers.queues, 1);
+    if (n->max_queues * 2 + 1 > VIRTIO_PCI_QUEUE_MAX) {
+        error_setg(errp, "Invalid number of queues (= %" PRIu32 "), "
+                   "must be a postive integer less than %d.",
+                   n->max_queues, (VIRTIO_PCI_QUEUE_MAX - 1) / 2);
+        virtio_cleanup(vdev);
+        return;
+    }
     n->vqs = g_malloc0(sizeof(VirtIONetQueue) * n->max_queues);
     n->vqs[0].rx_vq = virtio_add_queue(vdev, 256, virtio_net_handle_rx);
     n->curr_queues = 1;