From 34f9b2a8f7fa284f7d23cdd54cf3f3a2964200d0 Mon Sep 17 00:00:00 2001
From: Matt Johnston <matt@ucc.asn.au>
Date: Wed, 20 Mar 2013 23:13:19 +0800
Subject: [PATCH] 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(-)

diff --git a/packet.c b/packet.c
index 349ed400..f979caed 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 */
-- 
GitLab