# HG changeset patch # User Matt Johnston # Date 1448633948 -28800 # Node ID af940cefdba1afedc2dd3840bffce8e9d2465035 # Parent b370b4b172d0f43458129f1a9d6b0bd23defbc09 Fix "Avoid queueing into circbuffer when the channel is about to close" which broken handling EAGAIN/EINTR diff -r b370b4b172d0 -r af940cefdba1 common-channel.c --- a/common-channel.c Fri Nov 27 21:26:43 2015 +0800 +++ b/common-channel.c Fri Nov 27 22:19:08 2015 +0800 @@ -445,9 +445,10 @@ close_chan_fd(channel, fd, SHUT_WR); return DROPBEAR_FAILURE; } + } else { + cbuf_incrread(cbuf, written); + channel->recvdonelen += written; } - cbuf_incrread(cbuf, written); - channel->recvdonelen += written; return DROPBEAR_SUCCESS; } #endif /* !HAVE_WRITEV */ @@ -460,7 +461,7 @@ unsigned char *circ_p1, *circ_p2; unsigned int circ_len1, circ_len2; int io_count = 0; - int cbuf_written; + ssize_t written; cbuf_readptrs(cbuf, &circ_p1, &circ_len1, &circ_p2, &circ_len2); @@ -508,14 +509,14 @@ close_chan_fd(channel, fd, SHUT_WR); return DROPBEAR_FAILURE; } - } - - cbuf_written = MIN(circ_len1+circ_len2, (unsigned int)written); - cbuf_incrread(cbuf, cbuf_written); - if (morelen) { - *morelen = written - cbuf_written; + } else { + int cbuf_written = MIN(circ_len1+circ_len2, (unsigned int)written); + cbuf_incrread(cbuf, cbuf_written); + if (morelen) { + *morelen = written - cbuf_written; + } + channel->recvdonelen += written; } - channel->recvdonelen += written; return DROPBEAR_SUCCESS; } #endif /* HAVE_WRITEV */