summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatt Johnston <matt@ucc.asn.au>2014-08-06 22:08:16 +0800
committerMatt Johnston <matt@ucc.asn.au>2014-08-06 22:08:16 +0800
commit7fb9ba2c242d67b13d3f3a2811cfb7a559b47e91 (patch)
treed737452fe89eb194680345c6ab8e5867746cc887
parentce4af93d067b65f023afcbef3f2c9a670b786000 (diff)
parentae3538d7dfcbbf7099d43555bc6f51400af6c7f1 (diff)
downloaddropbear-7fb9ba2c242d67b13d3f3a2811cfb7a559b47e91.tar.gz
merge
-rw-r--r--packet.c9
1 files changed, 6 insertions, 3 deletions
diff --git a/packet.c b/packet.c
index 42d4229..add3203 100644
--- a/packet.c
+++ b/packet.c
@@ -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;
}