From: Anthony Liguori <[EMAIL PROTECTED]>

We should check that the first element is the size we expect instead of
just casting blindly.

Signed-off-by: Anthony Liguori <[EMAIL PROTECTED]>
Signed-off-by: Avi Kivity <[EMAIL PROTECTED]>

diff --git a/qemu/hw/virtio-blk.c b/qemu/hw/virtio-blk.c
index 3af36db..048285a 100644
--- a/qemu/hw/virtio-blk.c
+++ b/qemu/hw/virtio-blk.c
@@ -56,8 +56,6 @@ struct virtio_blk_outhdr
     uint32_t ioprio;
     /* Sector (ie. 512 byte offset) */
     uint64_t sector;
-    /* Where to put reply. */
-    uint64_t id;
 };
 
 #define VIRTIO_BLK_S_OK                0
@@ -94,6 +92,17 @@ static void virtio_blk_handle_output(VirtIODevice *vdev, 
VirtQueue *vq)
        off_t off;
        int i;
 
+       if (elem.out_num < 1 || elem.in_num < 1) {
+           fprintf(stderr, "virtio-blk missing headers\n");
+           exit(1);
+       }
+
+       if (elem.out_sg[0].iov_len != sizeof(*out) ||
+           elem.in_sg[elem.in_num - 1].iov_len != sizeof(*in)) {
+           fprintf(stderr, "virtio-blk header not in correct element\n");
+           exit(1);
+       }
+
        out = (void *)elem.out_sg[0].iov_base;
        in = (void *)elem.in_sg[elem.in_num - 1].iov_base;
        off = out->sector;
diff --git a/qemu/hw/virtio-net.c b/qemu/hw/virtio-net.c
index f727b14..5ac5089 100644
--- a/qemu/hw/virtio-net.c
+++ b/qemu/hw/virtio-net.c
@@ -125,6 +125,11 @@ static void virtio_net_receive(void *opaque, const uint8_t 
*buf, int size)
        return;
     }
 
+    if (elem.in_num < 1 || elem.in_sg[0].iov_len != sizeof(*hdr)) {
+       fprintf(stderr, "virtio-net header not in first element\n");
+       exit(1);
+    }
+
     hdr = (void *)elem.in_sg[0].iov_base;
     hdr->flags = 0;
     hdr->gso_type = VIRTIO_NET_HDR_GSO_NONE;
@@ -197,6 +202,11 @@ void virtio_net_poll(void)
                 continue;
             }
 
+           if (elem.in_num < 1 || elem.in_sg[0].iov_len != sizeof(*hdr)) {
+               fprintf(stderr, "virtio-net header not in first element\n");
+               exit(1);
+           }
+
             hdr = (void *)elem.in_sg[0].iov_base;
             hdr->flags = 0;
             hdr->gso_type = VIRTIO_NET_HDR_GSO_NONE;

-------------------------------------------------------------------------
This SF.net email is sponsored by the 2008 JavaOne(SM) Conference 
Don't miss this year's exciting event. There's still time to save $100. 
Use priority code J8TL2D2. 
http://ad.doubleclick.net/clk;198757673;13503038;p?http://java.sun.com/javaone
_______________________________________________
kvm-commits mailing list
kvm-commits@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/kvm-commits

Reply via email to