# HG changeset patch # User Matt Johnston # Date 1093320637 0 # Node ID 8aeac62a968f297337bc3341c8d7997a9d1ba682 # Parent 6571b480fa046806134299f7510f3ac17b8dba62 Allow leading lines before the ident banner when connecting diff -r 6571b480fa04 -r 8aeac62a968f common-session.c --- 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);