From d254e0191d27a98d09373b9df71ff3b13ffda092 Mon Sep 17 00:00:00 2001 From: Matt Johnston <matt@ucc.asn.au> Date: Tue, 24 Aug 2004 04:10:37 +0000 Subject: [PATCH] Allow leading lines before the ident banner when connecting --HG-- extra : convert_revision : ae4b1bdb29e60927c032674800f0258fc5966807 --- common-session.c | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/common-session.c b/common-session.c index 601136fe..420e03b2 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); -- GitLab