diff options
author | pst <pst@FreeBSD.org> | 1995-07-20 12:32:40 +0000 |
---|---|---|
committer | pst <pst@FreeBSD.org> | 1995-07-20 12:32:40 +0000 |
commit | d1a257b33a50fd4779c8ca67330933932f98a90c (patch) | |
tree | 5d3f433d05eca10f9aec842079aec4b66c447f1e /secure/libexec/telnetd | |
parent | d6b93135e2743f89332a3ea7f97d682dd40c7b85 (diff) | |
download | FreeBSD-src-d1a257b33a50fd4779c8ca67330933932f98a90c.zip FreeBSD-src-d1a257b33a50fd4779c8ca67330933932f98a90c.tar.gz |
The final negotiation of DO_BINARY in the LINEMODE portion of the telnetd code
causes some clients that do not support linemode to mis-interpret the return
key (i.e. double returns).
The fix is to only do the state check for binary options if linemode will
be used.
Closes PR#505.
Submitted by: Charles Henrich
Obtained from: FreeBSD insecure telnetd
Diffstat (limited to 'secure/libexec/telnetd')
-rw-r--r-- | secure/libexec/telnetd/termstat.c | 47 |
1 files changed, 28 insertions, 19 deletions
diff --git a/secure/libexec/telnetd/termstat.c b/secure/libexec/telnetd/termstat.c index ebc843a..f499137 100644 --- a/secure/libexec/telnetd/termstat.c +++ b/secure/libexec/telnetd/termstat.c @@ -144,25 +144,6 @@ localstat() #endif /* defined(CRAY2) && defined(UNICOS5) */ /* - * Check for state of BINARY options. - */ - if (tty_isbinaryin()) { - if (his_want_state_is_wont(TELOPT_BINARY)) - send_do(TELOPT_BINARY, 1); - } else { - if (his_want_state_is_will(TELOPT_BINARY)) - send_dont(TELOPT_BINARY, 1); - } - - if (tty_isbinaryout()) { - if (my_want_state_is_wont(TELOPT_BINARY)) - send_will(TELOPT_BINARY, 1); - } else { - if (my_want_state_is_will(TELOPT_BINARY)) - send_wont(TELOPT_BINARY, 1); - } - - /* * Check for changes to flow control if client supports it. */ flowstat(); @@ -181,6 +162,34 @@ localstat() tty_setlinemode(uselinemode); } + if (uselinemode) { + /* + * Check for state of BINARY options. + * + * We only need to do the binary dance if we are actually going + * to use linemode. As this confuses some telnet clients + * that don't support linemode, and doesn't gain us + * anything, we don't do it unless we're doing linemode. + * -Crh (henrich@msu.edu) + */ + + if (tty_isbinaryin()) { + if (his_want_state_is_wont(TELOPT_BINARY)) + send_do(TELOPT_BINARY, 1); + } else { + if (his_want_state_is_will(TELOPT_BINARY)) + send_dont(TELOPT_BINARY, 1); + } + + if (tty_isbinaryout()) { + if (my_want_state_is_wont(TELOPT_BINARY)) + send_will(TELOPT_BINARY, 1); + } else { + if (my_want_state_is_will(TELOPT_BINARY)) + send_wont(TELOPT_BINARY, 1); + } + } + #ifdef ENCRYPTION /* * If the terminal is not echoing, but editing is enabled, |