chiark / gitweb /
Fix writev rs iovec loop
authorIan Jackson <ian@chiark.greenend.org.uk>
Tue, 4 May 2010 08:43:11 +0000 (09:43 +0100)
committerIan Jackson <ian@chiark.greenend.org.uk>
Tue, 4 May 2010 08:43:11 +0000 (09:43 +0100)
backends/innduct.c

index ab992673ca150f5e5bdee9d0dfaa1a8c4e8b2c1d..85e5d6541ebb036da8709f265597b1f0c090b782 100644 (file)
@@ -1663,15 +1663,18 @@ static void *conn_write_some_xmits(Conn *conn) {
     assert(rs > 0);
 
     int done;
-    for (done=0; rs && done<conn->xmitu; done++) {
+    for (done=0; rs; ) {
+      assert(done<conn->xmitu);
       struct iovec *vp= &conn->xmit[done];
       XmitDetails *dp= &conn->xmitd[done];
-      if (rs > vp->iov_len) {
+      if (rs >= vp->iov_len) {
        rs -= vp->iov_len;
-       xmit_free(dp);
+       xmit_free(dp); /* vp->iov_len -= vp->iov_len, etc. */
+       done++;
       } else {
        vp->iov_base= (char*)vp->iov_base + rs;
        vp->iov_len -= rs;
+       break; /* rs -= rs */
       }
     }
     int newu= conn->xmitu - done;