diff common-session.c @ 103:8aeac62a968f

Allow leading lines before the ident banner when connecting
author Matt Johnston <matt@ucc.asn.au>
date Tue, 24 Aug 2004 04:10:37 +0000
parents 18eccbfb9641
children d3eb1fa8484e
line wrap: on
line diff
--- a/common-session.c	Tue Aug 24 04:07:41 2004 +0000
+++ b/common-session.c	Tue Aug 24 04:10:37 2004 +0000
@@ -223,6 +223,7 @@
 	char linebuf[256];
 	int len = 0;
 	char done = 0;
+	int i;
 
 	/* write our version string, this blocks */
 	if (atomicio(write, ses.sock, LOCAL_IDENT "\r\n",
@@ -230,14 +231,27 @@
 		dropbear_exit("Error writing ident string");
 	}
 
-	len = ident_readln(ses.sock, linebuf, 256);
-	if (len >= 4 && memcmp(linebuf, "SSH-", 4) == 0) {
-		/* start of line matches */
-		done = 1;
+	/* We allow up to 9 lines before the actual version string, to
+	 * account for wrappers/cruft etc. According to the spec only the client
+	 * needs to handle this, but no harm in letting the server handle it too */
+	for (i = 0; i < 10; i++) {
+		len = ident_readln(ses.sock, linebuf, sizzeof(linebuf));
+
+		if (len < 0 && errno != EINTR) {
+			/* It failed */
+			break;
+		}
+
+		if (len >= 4 && memcmp(linebuf, "SSH-", 4) == 0) {
+			/* start of line matches */
+			done = 1;
+			break;
+		}
 	}
 
 	if (!done) {
-		dropbear_exit("Failed to get client version");
+		TRACE(("err: %s for '%s'\n", strerror(errno), linebuf));
+		dropbear_exit("Failed to get remote version");
 	} else {
 		/* linebuf is already null terminated */
 		ses.remoteident = m_malloc(len);