qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-devel] Re: [PATCH 1/1] Fix loop logic in vhost_net_start()'s error


From: Michael S. Tsirkin
Subject: [Qemu-devel] Re: [PATCH 1/1] Fix loop logic in vhost_net_start()'s error path
Date: Tue, 14 Sep 2010 13:52:22 +0200
User-agent: Mutt/1.5.20 (2009-12-10)

On Tue, Sep 14, 2010 at 12:06:12PM +0200, address@hidden wrote:
> From: Jes Sorensen <address@hidden>
> 
> file.index is unsigned, hence 'while (--file.index >= 0)' will loop
> forever. Change it to do {} while (file.index-- > 0)
> 
> Signed-off-by: Jes Sorensen <address@hidden>
> ---
>  hw/vhost_net.c |    4 ++--
>  1 files changed, 2 insertions(+), 2 deletions(-)
> 
> diff --git a/hw/vhost_net.c b/hw/vhost_net.c
> index 4a7b819..b1f8072 100644
> --- a/hw/vhost_net.c
> +++ b/hw/vhost_net.c
> @@ -151,10 +151,10 @@ int vhost_net_start(struct vhost_net *net,
>      return 0;
>  fail:
>      file.fd = -1;
> -    while (--file.index >= 0) {
> +    do {
>          int r = ioctl(net->dev.control, VHOST_NET_SET_BACKEND, &file);
>          assert(r >= 0);
> -    }
> +    } while (file.index-- > 0);
>      net->vc->info->poll(net->vc, true);
>      vhost_dev_stop(&net->dev, dev);
>      if (net->dev.acked_features & (1 << VIRTIO_NET_F_MRG_RXBUF)) {

Hmm, this is not exactly right in that we first try with
file.index and not file.index - 1; if SET_BACKEND originally failed
with file.index and we try to undo this, we are likely to fail again
and trigger an assert.

I fixed this as follows.
Thanks!



vhost: fix infinite loop on error path

file.index is unsigned, hence 'while (--file.index >= 0)'
will loop > forever. Change to while (file.index-- > 0).

Reported-by: Jes Sorensen <address@hidden>
Signed-off-by: Michael S. Tsirkin <address@hidden>

--

diff --git a/hw/vhost_net.c b/hw/vhost_net.c
index 606aa0c..f2f4740 100644
--- a/hw/vhost_net.c
+++ b/hw/vhost_net.c
@@ -139,7 +139,7 @@ int vhost_net_start(struct vhost_net *net,
     return 0;
 fail:
     file.fd = -1;
-    while (--file.index >= 0) {
+    while (file.index-- > 0) {
         int r = ioctl(net->dev.control, VHOST_NET_SET_BACKEND, &file);
         assert(r >= 0);
     }



reply via email to

[Prev in Thread] Current Thread [Next in Thread]