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

[Xen-changelog] [mini-os master] Mini-OS: netfront: fix off-by-one error introduced in 7c8f3483



commit 5c70e2a1b3beae7222580c01e2cbac1685a03903
Author:     Samuel Thibault <samuel.thibault@xxxxxxxxxxxx>
AuthorDate: Fri Apr 1 20:17:01 2016 +0200
Commit:     Wei Liu <wei.liu2@xxxxxxxxxx>
CommitDate: Fri Apr 15 11:05:24 2016 +0100

    Mini-OS: netfront: fix off-by-one error introduced in 7c8f3483
    
    7c8f3483 introduced a break within a loop in netfront.c such that
    cons and nr_consumed were no longer always being incremented. The
    offset at cons will be processed multiple times with the break in
    place.
    
    This commit reverts to using the "some" variable in the loop condition,
    but avoids ifdefs for the non-libc case. It also renames it to dobreak
    to make its usage clearer.
    
    Signed-off-by: Samuel Thibault <samuel.thibault@xxxxxxxxxxxx>
    Tested-by: Sarah Newman <srn@xxxxxxxxx>
    Acked-by: Wei Liu <wei.liu2@xxxxxxxxxx>
---
 netfront.c | 20 ++++++--------------
 1 file changed, 6 insertions(+), 14 deletions(-)

diff --git a/netfront.c b/netfront.c
index 0eca5b5..b8fac62 100644
--- a/netfront.c
+++ b/netfront.c
@@ -97,19 +97,15 @@ void network_rx(struct netfront_dev *dev)
 {
     RING_IDX rp,cons,req_prod;
     int nr_consumed, more, i, notify;
-#ifdef HAVE_LIBC
-    int some;
-#endif
+    int dobreak;
 
     nr_consumed = 0;
 moretodo:
     rp = dev->rx.sring->rsp_prod;
     rmb(); /* Ensure we see queued responses up to 'rp'. */
 
-#ifdef HAVE_LIBC
-    some = 0;
-#endif
-    for (cons = dev->rx.rsp_cons; cons != rp; nr_consumed++, cons++)
+    dobreak = 0;
+    for (cons = dev->rx.rsp_cons; cons != rp && !dobreak; nr_consumed++, 
cons++)
     {
         struct net_buffer* buf;
         unsigned char* page;
@@ -134,8 +130,8 @@ moretodo:
                    len = dev->len;
                memcpy(dev->data, page+rx->offset, len);
                dev->rlen = len;
-               some = 1;
-                break;
+               /* No need to receive the rest for now */
+               dobreak = 1;
            } else
 #endif
                dev->netif_rx(page+rx->offset,rx->status);
@@ -144,11 +140,7 @@ moretodo:
     dev->rx.rsp_cons=cons;
 
     RING_FINAL_CHECK_FOR_RESPONSES(&dev->rx,more);
-#ifdef HAVE_LIBC
-    if(more && !some) goto moretodo;
-#else
-    if(more) goto moretodo;
-#endif
+    if(more && !dobreak) goto moretodo;
 
     req_prod = dev->rx.req_prod_pvt;
 
--
generated by git-patchbot for /home/xen/git/mini-os.git#master

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.