Mercurial > dropbear
diff packet.c @ 711:f4232b65b316
Fix "-m none" case where an entire packet fits in a block and can be
read by read_packet_init()
author | Matt Johnston <matt@ucc.asn.au> |
---|---|
date | Wed, 20 Mar 2013 23:13:19 +0800 |
parents | 895fbe068f2c |
children | f27058078d61 |
line wrap: on
line diff
--- a/packet.c Wed Mar 20 22:41:07 2013 +0800 +++ b/packet.c Wed Mar 20 23:13:19 2013 +0800 @@ -133,23 +133,30 @@ /* 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 */ decrypt_packet();