diff --git a/src/sbbs3/main.cpp b/src/sbbs3/main.cpp index f8a2619e93796448c269a6baac3b3cc2464543f4..1ffcb7c0c485cce4fa132ea202befe76ecea9f7b 100644 --- a/src/sbbs3/main.cpp +++ b/src/sbbs3/main.cpp @@ -1469,8 +1469,9 @@ static BYTE* telnet_interpret(sbbs_t* sbbs, BYTE* inbuf, int inlen, BYTE* first_cr=NULL; int i; + outlen=0; + if(inlen<1) { - outlen=0; return(inbuf); // no length? No interpretation } @@ -1485,19 +1486,20 @@ static BYTE* telnet_interpret(sbbs_t* sbbs, BYTE* inbuf, int inlen, first_cr=(BYTE*)memchr(inbuf, CR, inlen); } - if(!sbbs->telnet_cmdlen && first_iac==NULL && first_cr==NULL) { - outlen=inlen; - return(inbuf); // no interpretation needed - } + if(!sbbs->telnet_cmdlen) { + if(first_iac==NULL && first_cr==NULL) { + outlen=inlen; + return(inbuf); // no interpretation needed + } - if(first_iac!=NULL || first_cr!=NULL) { - if(first_iac!=NULL && (first_cr==NULL || first_iac<first_cr)) - outlen=first_iac-inbuf; - else - outlen=first_cr-inbuf; - memcpy(outbuf, inbuf, outlen); - } else - outlen=0; + if(first_iac!=NULL || first_cr!=NULL) { + if(first_iac!=NULL && (first_cr==NULL || first_iac<first_cr)) + outlen=first_iac-inbuf; + else + outlen=first_cr-inbuf; + memcpy(outbuf, inbuf, outlen); + } + } for(i=outlen;i<inlen;i++) { if(!(sbbs->telnet_mode&TELNET_MODE_GATE) @@ -1524,11 +1526,21 @@ static BYTE* telnet_interpret(sbbs_t* sbbs, BYTE* inbuf, int inlen, if(sbbs->telnet_cmdlen<sizeof(sbbs->telnet_cmd)) sbbs->telnet_cmd[sbbs->telnet_cmdlen++]=inbuf[i]; + else { + lprintf(LOG_WARNING, "Node %d telnet command (%d, %d) buffer limit reached (%u bytes)" + ,sbbs->cfg.node_num, sbbs->telnet_cmd[1], sbbs->telnet_cmd[2], sbbs->telnet_cmdlen); + sbbs->telnet_cmdlen = 0; + } uchar command = sbbs->telnet_cmd[1]; uchar option = sbbs->telnet_cmd[2]; - if(sbbs->telnet_cmdlen>=2 && command==TELNET_SB) { + if(sbbs->telnet_cmdlen == 2 && command == TELNET_SE) { + lprintf(LOG_WARNING, "Node %d unexpected telnet sub-negotiation END command" + ,sbbs->cfg.node_num); + sbbs->telnet_cmdlen = 0; + } + else if(sbbs->telnet_cmdlen>=2 && command==TELNET_SB) { if(inbuf[i]==TELNET_SE && sbbs->telnet_cmd[sbbs->telnet_cmdlen-2]==TELNET_IAC) { @@ -1633,7 +1645,7 @@ static BYTE* telnet_interpret(sbbs_t* sbbs, BYTE* inbuf, int inlen, ,sbbs->telnet_cmd[3]); sbbs->telnet_cmdlen=0; } - } + } // Sub-negotiation command else if(sbbs->telnet_cmdlen==2 && inbuf[i]<TELNET_WILL) { if(startup->options&BBS_OPT_DEBUG_TELNET) lprintf(LOG_DEBUG,"Node %d %s telnet cmd: %s" @@ -1725,9 +1737,7 @@ static BYTE* telnet_interpret(sbbs_t* sbbs, BYTE* inbuf, int inlen, #endif } } - sbbs->telnet_cmdlen=0; - } if(sbbs->telnet_mode&TELNET_MODE_GATE) // Pass-through commands outbuf[outlen++]=inbuf[i];