diff options
author | Matt Johnston <matt@ucc.asn.au> | 2004-08-24 04:10:37 +0000 |
---|---|---|
committer | Matt Johnston <matt@ucc.asn.au> | 2004-08-24 04:10:37 +0000 |
commit | d254e0191d27a98d09373b9df71ff3b13ffda092 (patch) | |
tree | 98aff38c512b4a91aa32ee86aac59914d5bd1ba0 /common-session.c | |
parent | 0ab18bd14c1a64d128fd0606611f812b1c797277 (diff) |
Allow leading lines before the ident banner when connecting
--HG--
extra : convert_revision : ae4b1bdb29e60927c032674800f0258fc5966807
Diffstat (limited to 'common-session.c')
-rw-r--r-- | common-session.c | 24 |
1 files changed, 19 insertions, 5 deletions
diff --git a/common-session.c b/common-session.c index 601136f..420e03b 100644 --- a/common-session.c +++ b/common-session.c @@ -223,6 +223,7 @@ void session_identification() { 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 @@ void session_identification() { 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); |