From 34f9b2a8f7fa284f7d23cdd54cf3f3a2964200d0 Mon Sep 17 00:00:00 2001 From: Matt Johnston Date: Wed, 20 Mar 2013 23:13:19 +0800 Subject: Fix "-m none" case where an entire packet fits in a block and can be read by read_packet_init() --- packet.c | 31 +++++++++++++++++++------------ 1 file changed, 19 insertions(+), 12 deletions(-) (limited to 'packet.c') diff --git a/packet.c b/packet.c index 349ed40..f979cae 100644 --- a/packet.c +++ b/packet.c @@ -133,22 +133,29 @@ void read_packet() { /* Attempt to read the remainder of the packet, note that there * mightn't be any available (EAGAIN) */ maxlen = ses.readbuf->len - ses.readbuf->pos; - len = read(ses.sock_in, buf_getptr(ses.readbuf, maxlen), maxlen); + if (maxlen == 0) { + /* Occurs when the packet is only a single block long and has all + * been read in read_packet_init(). Usually means that MAC is disabled + */ + len = 0; + } else { + len = read(ses.sock_in, buf_getptr(ses.readbuf, maxlen), maxlen); - if (len == 0) { - ses.remoteclosed(); - } + if (len == 0) { + ses.remoteclosed(); + } - if (len < 0) { - if (errno == EINTR || errno == EAGAIN) { - TRACE(("leave read_packet: EINTR or EAGAIN")) - return; - } else { - dropbear_exit("Error reading: %s", strerror(errno)); + if (len < 0) { + if (errno == EINTR || errno == EAGAIN) { + TRACE(("leave read_packet: EINTR or EAGAIN")) + return; + } else { + dropbear_exit("Error reading: %s", strerror(errno)); + } } - } - buf_incrpos(ses.readbuf, len); + buf_incrpos(ses.readbuf, len); + } if ((unsigned int)len == maxlen) { /* The whole packet has been read */ -- cgit v1.2.3