Mercurial > dropbear
changeset 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 | 6571b480fa04 |
children | 298098b2a61e |
files | common-session.c |
diffstat | 1 files changed, 19 insertions(+), 5 deletions(-) [+] |
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);