From: Ian Jackson Date: Tue, 4 May 2010 08:43:11 +0000 (+0100) Subject: Fix writev rs iovec loop X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?p=inn-innduct.git;a=commitdiff_plain;h=d3f32ccfd4a014eb5dac4e36efdcb7d95c57c451;ds=sidebyside Fix writev rs iovec loop --- diff --git a/backends/innduct.c b/backends/innduct.c index ab99267..85e5d65 100644 --- a/backends/innduct.c +++ b/backends/innduct.c @@ -1663,15 +1663,18 @@ static void *conn_write_some_xmits(Conn *conn) { assert(rs > 0); int done; - for (done=0; rs && donexmitu; done++) { + for (done=0; rs; ) { + assert(donexmitu); 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;