All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Michael S. Tsirkin" <mst@redhat.com>
To: "Andreas Färber" <afaerber@suse.de>
Cc: Bruce Rogers <brogers@suse.com>,
	Sebastian Krahmer <krahmer@suse.com>,
	qemu-stable@nongnu.org, qemu-devel@nongnu.org,
	David Marchand <david.marchand@6wind.com>,
	Sebastian Krahmer <krahmer@suse.de>,
	Stefan Hajnoczi <stefanha@redhat.com>,
	Cam Macdonell <cam@cs.ualberta.ca>
Subject: Re: [Qemu-devel] [PATCH v3 3/4] ivshmem: Fix potential OOB r/w access
Date: Mon, 22 Sep 2014 14:21:40 +0300	[thread overview]
Message-ID: <20140922112140.GF14882@redhat.com> (raw)
In-Reply-To: <1410799208-3250-4-git-send-email-afaerber@suse.de>

On Mon, Sep 15, 2014 at 06:40:07PM +0200, Andreas Färber wrote:
> From: Sebastian Krahmer <krahmer@suse.de>
> 
> Fix OOB access via malformed incoming_posn parameters
> and check that requested memory is actually alloc'ed.
> 
> Signed-off-by: Sebastian Krahmer <krahmer@suse.de>
> [AF: Rebased, cleanups, avoid fd leak]
> Cc: qemu-stable@nongnu.org
> Signed-off-by: Andreas Färber <afaerber@suse.de>

Reviewed-by: Michael S. Tsirkin <mst@redhat.com>

> ---
>  hw/misc/ivshmem.c | 27 +++++++++++++++++++++++----
>  1 file changed, 23 insertions(+), 4 deletions(-)
> 
> diff --git a/hw/misc/ivshmem.c b/hw/misc/ivshmem.c
> index 24f74f6..ecef82a 100644
> --- a/hw/misc/ivshmem.c
> +++ b/hw/misc/ivshmem.c
> @@ -29,6 +29,7 @@
>  
>  #include <sys/mman.h>
>  #include <sys/types.h>
> +#include <limits.h>
>  
>  #define PCI_VENDOR_ID_IVSHMEM   PCI_VENDOR_ID_REDHAT_QUMRANET
>  #define PCI_DEVICE_ID_IVSHMEM   0x1110
> @@ -410,14 +411,24 @@ static void close_guest_eventfds(IVShmemState *s, int posn)
>  
>  /* this function increase the dynamic storage need to store data about other
>   * guests */
> -static void increase_dynamic_storage(IVShmemState *s, int new_min_size) {
> +static int increase_dynamic_storage(IVShmemState *s, int new_min_size)
> +{
>  
>      int j, old_nb_alloc;
>  
> +    /* check for integer overflow */
> +    if (new_min_size >= INT_MAX / sizeof(Peer) - 1 || new_min_size <= 0) {
> +        return -1;
> +    }
> +
>      old_nb_alloc = s->nb_peers;
>  
> -    while (new_min_size >= s->nb_peers)
> -        s->nb_peers = s->nb_peers * 2;
> +    if (new_min_size >= s->nb_peers) {
> +        /* +1 because #new_min_size is used as last array index */
> +        s->nb_peers = new_min_size + 1;
> +    } else {
> +        return 0;
> +    }
>  
>      IVSHMEM_DPRINTF("bumping storage to %d guests\n", s->nb_peers);
>      s->peers = g_realloc(s->peers, s->nb_peers * sizeof(Peer));
> @@ -427,6 +438,8 @@ static void increase_dynamic_storage(IVShmemState *s, int new_min_size) {
>          s->peers[j].eventfds = NULL;
>          s->peers[j].nb_eventfds = 0;
>      }
> +
> +    return 0;
>  }
>  
>  static void ivshmem_read(void *opaque, const uint8_t *buf, int size)
> @@ -469,7 +482,13 @@ static void ivshmem_read(void *opaque, const uint8_t *buf, int size)
>  
>      /* make sure we have enough space for this guest */
>      if (incoming_posn >= s->nb_peers) {
> -        increase_dynamic_storage(s, incoming_posn);
> +        if (increase_dynamic_storage(s, incoming_posn) < 0) {
> +            error_report("increase_dynamic_storage() failed");
> +            if (tmp_fd != -1) {
> +                close(tmp_fd);
> +            }
> +            return;
> +        }
>      }
>  
>      if (tmp_fd == -1) {
> -- 
> 1.8.4.5

  reply	other threads:[~2014-09-22 11:18 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-09-15 16:40 [Qemu-devel] [PATCH v3 0/4] ivshmem security fixes Andreas Färber
2014-09-15 16:40 ` [Qemu-devel] [PATCH v3 1/4] ivshmem: Check ivshmem_read() size argument Andreas Färber
2014-09-22 11:21   ` Michael S. Tsirkin
2014-09-15 16:40 ` [Qemu-devel] [PATCH v3 2/4] ivshmem: validate incoming_posn value from server Andreas Färber
2014-09-22 11:21   ` Michael S. Tsirkin
2014-09-15 16:40 ` [Qemu-devel] [PATCH v3 3/4] ivshmem: Fix potential OOB r/w access Andreas Färber
2014-09-22 11:21   ` Michael S. Tsirkin [this message]
2014-09-15 16:40 ` [Qemu-devel] [PATCH v3 4/4] ivshmem: Fix fd leak on error Andreas Färber
2014-09-22 11:22   ` Michael S. Tsirkin
2014-10-31 16:03 ` [Qemu-devel] [PATCH v3 0/4] ivshmem security fixes Paolo Bonzini

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=20140922112140.GF14882@redhat.com \
    --to=mst@redhat.com \
    --cc=afaerber@suse.de \
    --cc=brogers@suse.com \
    --cc=cam@cs.ualberta.ca \
    --cc=david.marchand@6wind.com \
    --cc=krahmer@suse.com \
    --cc=krahmer@suse.de \
    --cc=qemu-devel@nongnu.org \
    --cc=qemu-stable@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.