diff options
author | Matt Johnston <matt@ucc.asn.au> | 2014-08-06 22:08:16 +0800 |
---|---|---|
committer | Matt Johnston <matt@ucc.asn.au> | 2014-08-06 22:08:16 +0800 |
commit | 7fb9ba2c242d67b13d3f3a2811cfb7a559b47e91 (patch) | |
tree | d737452fe89eb194680345c6ab8e5867746cc887 | |
parent | ce4af93d067b65f023afcbef3f2c9a670b786000 (diff) | |
parent | ae3538d7dfcbbf7099d43555bc6f51400af6c7f1 (diff) | |
download | dropbear-7fb9ba2c242d67b13d3f3a2811cfb7a559b47e91.tar.gz |
merge
-rw-r--r-- | packet.c | 9 |
1 files changed, 6 insertions, 3 deletions
@@ -93,9 +93,12 @@ void write_packet() { iov[i].iov_base = buf_getptr(writebuf, len); iov[i].iov_len = len; } + /* This may return EAGAIN. The main loop sometimes + calls write_packet() without bothering to test with select() since + it's likely to be necessary */ written = writev(ses.sock_out, iov, iov_max_count); if (written < 0) { - if (errno == EINTR) { + if (errno == EINTR || errno == EAGAIN) { m_free(iov); TRACE2(("leave write_packet: EINTR")) return; @@ -136,7 +139,7 @@ void write_packet() { written = write(ses.sock_out, buf_getptr(writebuf, len), len); if (written < 0) { - if (errno == EINTR) { + if (errno == EINTR || errno == EAGAIN) { TRACE2(("leave writepacket: EINTR")) return; } else { @@ -255,7 +258,7 @@ static int read_packet_init() { ses.remoteclosed(); } if (slen < 0) { - if (errno == EINTR) { + if (errno == EINTR || errno == EAGAIN) { TRACE2(("leave read_packet_init: EINTR")) return DROPBEAR_FAILURE; } |