All of lore.kernel.org
 help / color / mirror / Atom feed
* [Qemu-devel] [PATCH v1 0/2] check VirtiQueue Vring objects
@ 2017-11-24  7:55 P J P
  2017-11-24  7:55 ` [Qemu-devel] [PATCH v1 1/2] virtio: check VirtQueue Vring object is set P J P
                   ` (2 more replies)
  0 siblings, 3 replies; 7+ messages in thread
From: P J P @ 2017-11-24  7:55 UTC (permalink / raw)
  To: Qemu Developers
  Cc: Stefan Hajnoczi, zhangboxian, Paolo Bonzini, Prasad J Pandit

From: Prasad J Pandit <pjp@fedoraproject.org>

Hello,

An user could attempt to use an uninitialised VirtQueue object
or set Vring object with undue values, raising an unexpected
exception in Qemu. This patch set fixes this issue and also adds
a unit test to the suite.

Thank you.
--
Prasad J Pandit (2):
  virtio: check VirtQueue Vring object is set
  tests: add test to check VirtQueue object

 hw/virtio/virtio.c      | 11 ++++++++---
 tests/virtio-blk-test.c | 21 +++++++++++++++++++++
 2 files changed, 29 insertions(+), 3 deletions(-)

-- 
2.13.6

^ permalink raw reply	[flat|nested] 7+ messages in thread

* [Qemu-devel] [PATCH v1 1/2] virtio: check VirtQueue Vring object is set
  2017-11-24  7:55 [Qemu-devel] [PATCH v1 0/2] check VirtiQueue Vring objects P J P
@ 2017-11-24  7:55 ` P J P
  2017-11-24  9:01   ` Cornelia Huck
  2017-11-24 11:54   ` Stefan Hajnoczi
  2017-11-24  7:55 ` [Qemu-devel] [PATCH v1 2/2] tests: add test to check VirtQueue object P J P
  2017-11-24  9:42 ` [Qemu-devel] [PATCH v1 0/2] check VirtiQueue Vring objects Paolo Bonzini
  2 siblings, 2 replies; 7+ messages in thread
From: P J P @ 2017-11-24  7:55 UTC (permalink / raw)
  To: Qemu Developers
  Cc: Stefan Hajnoczi, zhangboxian, Paolo Bonzini, Prasad J Pandit

From: Prasad J Pandit <pjp@fedoraproject.org>

An user could attempt to use an uninitialised VirtQueue object
or unset Vring.align leading to a arithmetic exception. Add check
to avoid it.

Reported-by: Zhangboxian <zhangboxian@huawei.com>
Signed-off-by: Prasad J Pandit <pjp@fedoraproject.org>
---
 hw/virtio/virtio.c | 11 ++++++++---
 1 file changed, 8 insertions(+), 3 deletions(-)

Updated: add vring.num check to virtio_queue_update_rings
  -> https://lists.gnu.org/archive/html/qemu-devel/2017-11/msg04499.html

diff --git a/hw/virtio/virtio.c b/hw/virtio/virtio.c
index 5884ce3480..0940f1daf3 100644
--- a/hw/virtio/virtio.c
+++ b/hw/virtio/virtio.c
@@ -182,7 +182,7 @@ void virtio_queue_update_rings(VirtIODevice *vdev, int n)
 {
     VRing *vring = &vdev->vq[n].vring;
 
-    if (!vring->desc) {
+    if (!vdev->vq[n].vring.num || !vring->desc || !vring->align) {
         /* not yet setup -> nothing to do */
         return;
     }
@@ -1414,6 +1414,9 @@ void virtio_config_modern_writel(VirtIODevice *vdev,
 
 void virtio_queue_set_addr(VirtIODevice *vdev, int n, hwaddr addr)
 {
+    if (!vdev->vq[n].vring.num) {
+        return;
+    }
     vdev->vq[n].vring.desc = addr;
     virtio_queue_update_rings(vdev, n);
 }
@@ -1494,8 +1497,10 @@ void virtio_queue_set_align(VirtIODevice *vdev, int n, int align)
      */
     assert(k->has_variable_vring_alignment);
 
-    vdev->vq[n].vring.align = align;
-    virtio_queue_update_rings(vdev, n);
+    if (align) {
+        vdev->vq[n].vring.align = align;
+        virtio_queue_update_rings(vdev, n);
+    }
 }
 
 static bool virtio_queue_notify_aio_vq(VirtQueue *vq)
-- 
2.13.6

^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [Qemu-devel] [PATCH v1 2/2] tests: add test to check VirtQueue object
  2017-11-24  7:55 [Qemu-devel] [PATCH v1 0/2] check VirtiQueue Vring objects P J P
  2017-11-24  7:55 ` [Qemu-devel] [PATCH v1 1/2] virtio: check VirtQueue Vring object is set P J P
@ 2017-11-24  7:55 ` P J P
  2017-11-24 11:49   ` Stefan Hajnoczi
  2017-11-24  9:42 ` [Qemu-devel] [PATCH v1 0/2] check VirtiQueue Vring objects Paolo Bonzini
  2 siblings, 1 reply; 7+ messages in thread
From: P J P @ 2017-11-24  7:55 UTC (permalink / raw)
  To: Qemu Developers
  Cc: Stefan Hajnoczi, zhangboxian, Paolo Bonzini, Prasad J Pandit

From: Prasad J Pandit <pjp@fedoraproject.org>

An uninitialised VirtQueue object or one with Vring.align field
set to zero(0) could lead to arithmetic exceptions. Add a unit
test to validate it.

Signed-off-by: Prasad J Pandit <pjp@fedoraproject.org>
---
 tests/virtio-blk-test.c | 21 +++++++++++++++++++++
 1 file changed, 21 insertions(+)

diff --git a/tests/virtio-blk-test.c b/tests/virtio-blk-test.c
index e6fb9bac87..d00ceb0501 100644
--- a/tests/virtio-blk-test.c
+++ b/tests/virtio-blk-test.c
@@ -674,6 +674,26 @@ static void pci_hotplug(void)
     qtest_shutdown(qs);
 }
 
+static void test_vring_align(void)
+{
+    QPCIBar bar0;
+    QOSState *qs;
+    QPCIDevice *dev;
+
+    qs = pci_test_start();
+    dev = qpci_device_find(qs->pcibus, QPCI_DEVFN(4, 0));
+    g_assert(dev != NULL);
+
+    qpci_device_enable(dev);
+    bar0 = qpci_iomap(dev, 0, NULL);
+
+    qpci_io_writeb(dev, bar0, VIRTIO_PCI_QUEUE_SEL, 2);
+    qpci_io_writel(dev, bar0, VIRTIO_PCI_QUEUE_PFN, 1);
+
+    g_free(dev);
+    qtest_shutdown(qs);
+}
+
 static void mmio_basic(void)
 {
     QVirtioMMIODevice *dev;
@@ -724,6 +744,7 @@ int main(int argc, char **argv)
         qtest_add_func("/virtio/blk/pci/basic", pci_basic);
         qtest_add_func("/virtio/blk/pci/indirect", pci_indirect);
         qtest_add_func("/virtio/blk/pci/config", pci_config);
+        qtest_add_func("/virtio/blk/pci/vring", test_vring_align);
         if (strcmp(arch, "i386") == 0 || strcmp(arch, "x86_64") == 0) {
             qtest_add_func("/virtio/blk/pci/msix", pci_msix);
             qtest_add_func("/virtio/blk/pci/idx", pci_idx);
-- 
2.13.6

^ permalink raw reply related	[flat|nested] 7+ messages in thread

* Re: [Qemu-devel] [PATCH v1 1/2] virtio: check VirtQueue Vring object is set
  2017-11-24  7:55 ` [Qemu-devel] [PATCH v1 1/2] virtio: check VirtQueue Vring object is set P J P
@ 2017-11-24  9:01   ` Cornelia Huck
  2017-11-24 11:54   ` Stefan Hajnoczi
  1 sibling, 0 replies; 7+ messages in thread
From: Cornelia Huck @ 2017-11-24  9:01 UTC (permalink / raw)
  To: P J P
  Cc: Qemu Developers, Paolo Bonzini, zhangboxian, Stefan Hajnoczi,
	Prasad J Pandit

On Fri, 24 Nov 2017 13:25:41 +0530
P J P <ppandit@redhat.com> wrote:

> From: Prasad J Pandit <pjp@fedoraproject.org>
> 
> An user could attempt to use an uninitialised VirtQueue object
> or unset Vring.align leading to a arithmetic exception. Add check
> to avoid it.
> 
> Reported-by: Zhangboxian <zhangboxian@huawei.com>
> Signed-off-by: Prasad J Pandit <pjp@fedoraproject.org>
> ---
>  hw/virtio/virtio.c | 11 ++++++++---
>  1 file changed, 8 insertions(+), 3 deletions(-)
> 
> Updated: add vring.num check to virtio_queue_update_rings
>   -> https://lists.gnu.org/archive/html/qemu-devel/2017-11/msg04499.html  
> 
> diff --git a/hw/virtio/virtio.c b/hw/virtio/virtio.c
> index 5884ce3480..0940f1daf3 100644
> --- a/hw/virtio/virtio.c
> +++ b/hw/virtio/virtio.c
> @@ -182,7 +182,7 @@ void virtio_queue_update_rings(VirtIODevice *vdev, int n)
>  {
>      VRing *vring = &vdev->vq[n].vring;
>  
> -    if (!vring->desc) {
> +    if (!vdev->vq[n].vring.num || !vring->desc || !vring->align) {
>          /* not yet setup -> nothing to do */

The check now implies "not yet setup or non-existing queue", no?

(Not that the check is wrong.)

>          return;
>      }
> @@ -1414,6 +1414,9 @@ void virtio_config_modern_writel(VirtIODevice *vdev,
>  
>  void virtio_queue_set_addr(VirtIODevice *vdev, int n, hwaddr addr)
>  {
> +    if (!vdev->vq[n].vring.num) {
> +        return;
> +    }
>      vdev->vq[n].vring.desc = addr;
>      virtio_queue_update_rings(vdev, n);
>  }
> @@ -1494,8 +1497,10 @@ void virtio_queue_set_align(VirtIODevice *vdev, int n, int align)
>       */
>      assert(k->has_variable_vring_alignment);
>  
> -    vdev->vq[n].vring.align = align;
> -    virtio_queue_update_rings(vdev, n);
> +    if (align) {
> +        vdev->vq[n].vring.align = align;
> +        virtio_queue_update_rings(vdev, n);
> +    }
>  }
>  
>  static bool virtio_queue_notify_aio_vq(VirtQueue *vq)

I think you also need to check for num in virtio_queue_set_rings().

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [Qemu-devel] [PATCH v1 0/2] check VirtiQueue Vring objects
  2017-11-24  7:55 [Qemu-devel] [PATCH v1 0/2] check VirtiQueue Vring objects P J P
  2017-11-24  7:55 ` [Qemu-devel] [PATCH v1 1/2] virtio: check VirtQueue Vring object is set P J P
  2017-11-24  7:55 ` [Qemu-devel] [PATCH v1 2/2] tests: add test to check VirtQueue object P J P
@ 2017-11-24  9:42 ` Paolo Bonzini
  2 siblings, 0 replies; 7+ messages in thread
From: Paolo Bonzini @ 2017-11-24  9:42 UTC (permalink / raw)
  To: P J P, Qemu Developers; +Cc: Stefan Hajnoczi, zhangboxian, Prasad J Pandit

On 24/11/2017 08:55, P J P wrote:
> From: Prasad J Pandit <pjp@fedoraproject.org>
> 
> Hello,
> 
> An user could attempt to use an uninitialised VirtQueue object
> or set Vring object with undue values, raising an unexpected
> exception in Qemu. This patch set fixes this issue and also adds
> a unit test to the suite.
> 
> Thank you.
> --
> Prasad J Pandit (2):
>   virtio: check VirtQueue Vring object is set
>   tests: add test to check VirtQueue object
> 
>  hw/virtio/virtio.c      | 11 ++++++++---
>  tests/virtio-blk-test.c | 21 +++++++++++++++++++++
>  2 files changed, 29 insertions(+), 3 deletions(-)
> 

Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [Qemu-devel] [PATCH v1 2/2] tests: add test to check VirtQueue object
  2017-11-24  7:55 ` [Qemu-devel] [PATCH v1 2/2] tests: add test to check VirtQueue object P J P
@ 2017-11-24 11:49   ` Stefan Hajnoczi
  0 siblings, 0 replies; 7+ messages in thread
From: Stefan Hajnoczi @ 2017-11-24 11:49 UTC (permalink / raw)
  To: P J P; +Cc: Qemu Developers, zhangboxian, Paolo Bonzini, Prasad J Pandit

[-- Attachment #1: Type: text/plain, Size: 1550 bytes --]

On Fri, Nov 24, 2017 at 01:25:42PM +0530, P J P wrote:
> From: Prasad J Pandit <pjp@fedoraproject.org>
> 
> An uninitialised VirtQueue object or one with Vring.align field
> set to zero(0) could lead to arithmetic exceptions. Add a unit
> test to validate it.
> 
> Signed-off-by: Prasad J Pandit <pjp@fedoraproject.org>
> ---
>  tests/virtio-blk-test.c | 21 +++++++++++++++++++++
>  1 file changed, 21 insertions(+)
> 
> diff --git a/tests/virtio-blk-test.c b/tests/virtio-blk-test.c
> index e6fb9bac87..d00ceb0501 100644
> --- a/tests/virtio-blk-test.c
> +++ b/tests/virtio-blk-test.c
> @@ -674,6 +674,26 @@ static void pci_hotplug(void)
>      qtest_shutdown(qs);
>  }
>  
> +static void test_vring_align(void)

It's important to include a doc comment so the purpose of the test is
clear:

/*
 * Check that setting the vring addr on a non-existent virtqueue does
 * not crash.
 */

I think the _align name is confusing since the vring alignment is not
directly affected by this test case.  Please call it
test_nonexistent_virtqueue() instead.

> +{
> +    QPCIBar bar0;
> +    QOSState *qs;
> +    QPCIDevice *dev;
> +
> +    qs = pci_test_start();
> +    dev = qpci_device_find(qs->pcibus, QPCI_DEVFN(4, 0));
> +    g_assert(dev != NULL);
> +
> +    qpci_device_enable(dev);
> +    bar0 = qpci_iomap(dev, 0, NULL);
> +
> +    qpci_io_writeb(dev, bar0, VIRTIO_PCI_QUEUE_SEL, 2);
> +    qpci_io_writel(dev, bar0, VIRTIO_PCI_QUEUE_PFN, 1);
> +
> +    g_free(dev);
> +    qtest_shutdown(qs);
> +}


[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 455 bytes --]

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [Qemu-devel] [PATCH v1 1/2] virtio: check VirtQueue Vring object is set
  2017-11-24  7:55 ` [Qemu-devel] [PATCH v1 1/2] virtio: check VirtQueue Vring object is set P J P
  2017-11-24  9:01   ` Cornelia Huck
@ 2017-11-24 11:54   ` Stefan Hajnoczi
  1 sibling, 0 replies; 7+ messages in thread
From: Stefan Hajnoczi @ 2017-11-24 11:54 UTC (permalink / raw)
  To: P J P; +Cc: Qemu Developers, zhangboxian, Paolo Bonzini, Prasad J Pandit

[-- Attachment #1: Type: text/plain, Size: 669 bytes --]

On Fri, Nov 24, 2017 at 01:25:41PM +0530, P J P wrote:
> From: Prasad J Pandit <pjp@fedoraproject.org>
> 
> An user could attempt to use an uninitialised VirtQueue object
> or unset Vring.align leading to a arithmetic exception. Add check
> to avoid it.
> 
> Reported-by: Zhangboxian <zhangboxian@huawei.com>
> Signed-off-by: Prasad J Pandit <pjp@fedoraproject.org>
> ---
>  hw/virtio/virtio.c | 11 ++++++++---
>  1 file changed, 8 insertions(+), 3 deletions(-)
> 
> Updated: add vring.num check to virtio_queue_update_rings
>   -> https://lists.gnu.org/archive/html/qemu-devel/2017-11/msg04499.html

Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 455 bytes --]

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2017-11-24 11:54 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-11-24  7:55 [Qemu-devel] [PATCH v1 0/2] check VirtiQueue Vring objects P J P
2017-11-24  7:55 ` [Qemu-devel] [PATCH v1 1/2] virtio: check VirtQueue Vring object is set P J P
2017-11-24  9:01   ` Cornelia Huck
2017-11-24 11:54   ` Stefan Hajnoczi
2017-11-24  7:55 ` [Qemu-devel] [PATCH v1 2/2] tests: add test to check VirtQueue object P J P
2017-11-24 11:49   ` Stefan Hajnoczi
2017-11-24  9:42 ` [Qemu-devel] [PATCH v1 0/2] check VirtiQueue Vring objects Paolo Bonzini

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.