fix wrong decoding of the IAC escape char

This commit is contained in:
Frank Rolsted Jensen
2018-09-06 09:06:02 +02:00
parent 568f5ca733
commit 96329fc290
2 changed files with 13 additions and 3 deletions
+1
View File
@@ -20,6 +20,7 @@ typedef struct {
srv_ms_f *srv_ms; /* Modem status from server */ srv_ms_f *srv_ms; /* Modem status from server */
unsigned int bytes_rx; /* Rx byte count */ unsigned int bytes_rx; /* Rx byte count */
unsigned int off_rx; /* Rx buffer offset */
unsigned char mode_telnet; /* Telnet mode */ unsigned char mode_telnet; /* Telnet mode */
unsigned char mode_rfc2217; /* RFC-2217 mode */ unsigned char mode_rfc2217; /* RFC-2217 mode */
unsigned char telnet_ack[256]; /* telnet option ack counter */ unsigned char telnet_ack[256]; /* telnet option ack counter */
+12 -3
View File
@@ -132,7 +132,10 @@ int telnet_rx(tn_ctx_t * tcc, char *buf, size_t * plen)
len = *plen; len = *plen;
tcc->bytes_rx += len; tcc->bytes_rx += len;
for (s = buf, rem = len; rem > 0; s = p) if (len < (size_t)tcc->off_rx)
tcc->off_rx = 0;
for (s = buf + tcc->off_rx, rem = len - tcc->off_rx; rem > 0; s = p)
{ {
p = memchr(s, TNC_FF_IAC, rem); p = memchr(s, TNC_FF_IAC, rem);
if (!p) if (!p)
@@ -166,7 +169,7 @@ int telnet_rx(tn_ctx_t * tcc, char *buf, size_t * plen)
case TNC_FD_DO: case TNC_FD_DO:
case TNC_FE_DONT: case TNC_FE_DONT:
if (np < 3) if (np < 3)
return 1; /* Need more */ goto tn_more; /* Need more */
tcc->mode_telnet = 1; /* Any such sequence activates TN */ tcc->mode_telnet = 1; /* Any such sequence activates TN */
b2 = pu[2]; b2 = pu[2];
if (b1 == TNC_FB_WILL) if (b1 == TNC_FB_WILL)
@@ -192,7 +195,7 @@ int telnet_rx(tn_ctx_t * tcc, char *buf, size_t * plen)
} }
} }
if (np < 16) if (np < 16)
return 1; /* Not done */ goto tn_more; /* Not done */
/* This does not look right */ /* This does not look right */
rem = 0; /* Quit loop */ rem = 0; /* Quit loop */
break; break;
@@ -213,9 +216,15 @@ int telnet_rx(tn_ctx_t * tcc, char *buf, size_t * plen)
tn_break: tn_break:
rem = 0; /* Quit loop */ rem = 0; /* Quit loop */
break; break;
tn_more: /* Request more data */
tcc->off_rx = len - np;
*plen = len;
return 1;
} }
} }
tcc->off_rx = 0;
*plen = len; *plen = len;
return 0; return 0;