From b0150d299f80b8d0245bd419c78a40a013f03e0c Mon Sep 17 00:00:00 2001 From: Denis Vlasenko Date: Fri, 7 Nov 2008 01:58:21 +0000 Subject: [PATCH] telnetd: handle emacs M-DEL and IAC-NOP (putty keepalive) by Jim Cathey (jcathey AT ciena.com) function old new delta telnetd_main 1314 1364 +50 --- networking/telnetd.c | 75 +++++++++++++++++++++++++------------------- 1 file changed, 43 insertions(+), 32 deletions(-) diff --git a/networking/telnetd.c b/networking/telnetd.c index efc2bf607..f60c42056 100644 --- a/networking/telnetd.c +++ b/networking/telnetd.c @@ -96,44 +96,55 @@ remove_iacs(struct tsession *ts, int *pnum_totty) *totty++ = c; ptr++; - /* We now map \r\n ==> \r for pragmatic reasons. + /* We map \r\n ==> \r for pragmatic reasons. * Many client implementations send \r\n when * the user hits the CarriageReturn key. */ if (c == '\r' && ptr < end && (*ptr == '\n' || *ptr == '\0')) ptr++; - } else { - /* - * TELOPT_NAWS support! - */ - if ((ptr+2) >= end) { - /* only the beginning of the IAC is in the - buffer we were asked to process, we can't - process this char. */ - break; - } - - /* - * IAC -> SB -> TELOPT_NAWS -> 4-byte -> IAC -> SE - */ - else if (ptr[1] == SB && ptr[2] == TELOPT_NAWS) { - struct winsize ws; - - if ((ptr+8) >= end) - break; /* incomplete, can't process */ - ws.ws_col = (ptr[3] << 8) | ptr[4]; - ws.ws_row = (ptr[5] << 8) | ptr[6]; - ioctl(ts->ptyfd, TIOCSWINSZ, (char *)&ws); - ptr += 9; - } else { - /* skip 3-byte IAC non-SB cmd */ -#if DEBUG - fprintf(stderr, "Ignoring IAC %s,%s\n", - TELCMD(ptr[1]), TELOPT(ptr[2])); -#endif - ptr += 3; - } + continue; } + + if ((ptr+1) >= end) + break; + if (ptr[1] == NOP) { /* Ignore? (putty keepalive, etc.) */ + ptr += 2; + continue; + } + if (ptr[1] == IAC) { /* Literal IAC? (emacs M-DEL) */ + *totty++ = ptr[1]; + ptr += 2; + continue; + } + + /* + * TELOPT_NAWS support! + */ + if ((ptr+2) >= end) { + /* only the beginning of the IAC is in the + buffer we were asked to process, we can't + process this char. */ + break; + } + /* + * IAC -> SB -> TELOPT_NAWS -> 4-byte -> IAC -> SE + */ + if (ptr[1] == SB && ptr[2] == TELOPT_NAWS) { + struct winsize ws; + if ((ptr+8) >= end) + break; /* incomplete, can't process */ + ws.ws_col = (ptr[3] << 8) | ptr[4]; + ws.ws_row = (ptr[5] << 8) | ptr[6]; + ioctl(ts->ptyfd, TIOCSWINSZ, (char *)&ws); + ptr += 9; + continue; + } + /* skip 3-byte IAC non-SB cmd */ +#if DEBUG + fprintf(stderr, "Ignoring IAC %s,%s\n", + TELCMD(ptr[1]), TELOPT(ptr[2])); +#endif + ptr += 3; } num_totty = totty - ptr0;