All of lore.kernel.org
 help / color / mirror / Atom feed
From: Greg Kurz <groug@kaod.org>
To: Stefan Hajnoczi <stefanha@redhat.com>
Cc: qemu-devel@nongnu.org, Kevin Wolf <kwolf@redhat.com>,
	"Michael S. Tsirkin" <mst@redhat.com>,
	Jason Wang <jasowang@redhat.com>, Max Reitz <mreitz@redhat.com>,
	"Aneesh Kumar K.V" <aneesh.kumar@linux.vnet.ibm.com>,
	Cornelia Huck <cornelia.huck@de.ibm.com>,
	Paolo Bonzini <pbonzini@redhat.com>
Subject: Re: [Qemu-devel] [PATCH v2 3/9] virtio-9p: handle handle_9p_output() error
Date: Fri, 23 Sep 2016 15:49:08 +0200	[thread overview]
Message-ID: <20160923154908.25ba3653@bahia.lab.toulouse-stg.fr.ibm.com> (raw)
In-Reply-To: <20160923125417.GI8221@stefanha-x1.localdomain>

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

On Fri, 23 Sep 2016 13:54:17 +0100
Stefan Hajnoczi <stefanha@redhat.com> wrote:

> On Wed, Sep 21, 2016 at 06:57:12PM +0200, Greg Kurz wrote:
> > A broken guest may send a request with only non-empty out buffers
> > or only non-empty in buffers, virtqueue_pop() will then return a
> > VirtQueueElement with out_num == 0 or in_num == 0 respectively.
> > 
> > All 9P requests are expected to start with the following 7-byte header:
> > 
> >             uint32_t size_le;
> >             uint8_t id;
> >             uint16_t tag_le;
> > 
> > If iov_to_buf() fails to return these 7 bytes, then something is wrong in
> > the guest.
> > 
> > In both cases, it is wrong to crash QEMU, since the root cause lies in the
> > guest. Let's switch the device to the broken state instead.
> > 
> > Signed-off-by: Greg Kurz <groug@kaod.org>
> > ---
> > v2: - added out_free_pdu: label for errors or when virtqueue is empty
> > ---
> >  hw/9pfs/virtio-9p-device.c |   20 ++++++++++++++++----
> >  1 file changed, 16 insertions(+), 4 deletions(-)
> > 
> > diff --git a/hw/9pfs/virtio-9p-device.c b/hw/9pfs/virtio-9p-device.c
> > index e7ea0e45f3dd..5f3a67cfc717 100644
> > --- a/hw/9pfs/virtio-9p-device.c
> > +++ b/hw/9pfs/virtio-9p-device.c
> > @@ -52,17 +52,24 @@ static void handle_9p_output(VirtIODevice *vdev, VirtQueue *vq)
> >  
> >          elem = virtqueue_pop(vq, sizeof(VirtQueueElement));
> >          if (!elem) {
> > -            pdu_free(pdu);
> > -            break;
> > +            goto out_free_pdu;
> >          }
> >  
> > -        BUG_ON(elem->out_num == 0 || elem->in_num == 0);
> > +        if (elem->out_num == 0 || elem->in_num == 0) {
> > +            virtio_error(vdev,
> > +                         "The guest sent a VirtFS request without headers");
> > +            goto out_free_pdu;
> > +        }  
> 
> I'm not sure this check is even necessary since we check
> iov_to_buf(elem->out_sg[]) and pdu_marshall() avoids overflowing
> elem->in_sg[].
> 

I agree that the difference between absent and empty out headers is quite
subtile indeed. It would probably be acceptable to rely on iov_to_buf(),
the same way virtio-net relies on iov_size() I guess.

The case of elem->in_sg[] seems different though: unless I missed something,
v9fs_packunpack() will simply return -ENOBUFS. The error will be propagated
to pdu_complete(), which does not even check for errors (see the comment).
And then we'll push a broken element to the guest... I'd rather raise the
flag here.

> Either way, your change is correct:
> 
> Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>

[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 181 bytes --]

  reply	other threads:[~2016-09-23 13:49 UTC|newest]

Thread overview: 27+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-09-21 16:56 [Qemu-devel] [PATCH v2 0/9] virtio: avoid inappropriate QEMU termination Greg Kurz
2016-09-21 16:56 ` [Qemu-devel] [PATCH v2 1/9] virtio-9p: add parentheses to sizeof operator Greg Kurz
2016-09-22 13:38   ` Cornelia Huck
2016-09-23 12:44   ` Stefan Hajnoczi
2016-09-21 16:57 ` [Qemu-devel] [PATCH v2 2/9] virtio-blk: turn virtio_blk_handle_request() into a static function Greg Kurz
2016-09-22 13:40   ` Cornelia Huck
2016-09-23 12:45   ` Stefan Hajnoczi
2016-09-21 16:57 ` [Qemu-devel] [PATCH v2 3/9] virtio-9p: handle handle_9p_output() error Greg Kurz
2016-09-22 13:41   ` Cornelia Huck
2016-09-23 12:54   ` Stefan Hajnoczi
2016-09-23 13:49     ` Greg Kurz [this message]
2016-09-21 16:57 ` [Qemu-devel] [PATCH v2 4/9] virtio-blk: handle virtio_blk_handle_request() errors Greg Kurz
2016-09-22 13:44   ` Cornelia Huck
2016-09-23 12:58   ` Stefan Hajnoczi
2016-09-24 18:01     ` Greg Kurz
2016-09-21 16:57 ` [Qemu-devel] [PATCH v2 5/9] virtio-net: handle virtio_net_handle_ctrl() error Greg Kurz
2016-09-22 13:45   ` Cornelia Huck
2016-09-23 13:07   ` Stefan Hajnoczi
2016-09-21 16:57 ` [Qemu-devel] [PATCH v2 6/9] virtio-net: handle virtio_net_receive() errors Greg Kurz
2016-09-23 13:11   ` Stefan Hajnoczi
2016-09-21 16:57 ` [Qemu-devel] [PATCH v2 7/9] virtio-net: handle virtio_net_flush_tx() errors Greg Kurz
2016-09-21 16:57 ` [Qemu-devel] [PATCH v2 8/9] virtio-scsi: convert virtio_scsi_bad_req() to use virtio_error() Greg Kurz
2016-09-21 16:58 ` [Qemu-devel] [PATCH v2 9/9] virtio-scsi: handle virtio_scsi_set_config() error Greg Kurz
2016-09-21 17:50 ` [Qemu-devel] [PATCH v2 0/9] virtio: avoid inappropriate QEMU termination no-reply
2016-09-22 13:47 ` Cornelia Huck
2016-09-23 13:31 ` Stefan Hajnoczi
2016-09-23 14:00   ` Greg Kurz

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20160923154908.25ba3653@bahia.lab.toulouse-stg.fr.ibm.com \
    --to=groug@kaod.org \
    --cc=aneesh.kumar@linux.vnet.ibm.com \
    --cc=cornelia.huck@de.ibm.com \
    --cc=jasowang@redhat.com \
    --cc=kwolf@redhat.com \
    --cc=mreitz@redhat.com \
    --cc=mst@redhat.com \
    --cc=pbonzini@redhat.com \
    --cc=qemu-devel@nongnu.org \
    --cc=stefanha@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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.