mirror of https://gerrit.osmocom.org/libtelnet
change behavior of invalid IAC sequence inside subnegotiation to match BSD telnet implementation
This commit is contained in:
parent
330c261562
commit
2d5f4bfa9f
20
libtelnet.c
20
libtelnet.c
|
@ -472,8 +472,7 @@ static telnet_error_t _buffer_byte(telnet_t *telnet,
|
||||||
return TELNET_EOK;
|
return TELNET_EOK;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void _process(telnet_t *telnet, const char *buffer,
|
static void _process(telnet_t *telnet, const char *buffer, size_t size) {
|
||||||
size_t size) {
|
|
||||||
unsigned char byte;
|
unsigned char byte;
|
||||||
size_t i, start;
|
size_t i, start;
|
||||||
for (i = start = 0; i != size; ++i) {
|
for (i = start = 0; i != size; ++i) {
|
||||||
|
@ -601,13 +600,24 @@ static void _process(telnet_t *telnet, const char *buffer,
|
||||||
telnet->state = TELNET_STATE_SB_DATA;
|
telnet->state = TELNET_STATE_SB_DATA;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
/* something else -- protocol error */
|
/* something else -- protocol error. attempt to process
|
||||||
|
* content in subnegotiation buffer, then evaluate the
|
||||||
|
* given command as an IAC code.
|
||||||
|
*/
|
||||||
default:
|
default:
|
||||||
_error(telnet, __LINE__, __func__, TELNET_EPROTOCOL, 0,
|
_error(telnet, __LINE__, __func__, TELNET_EPROTOCOL, 0,
|
||||||
"unexpected byte after IAC inside SB: %d",
|
"unexpected byte after IAC inside SB: %d",
|
||||||
byte);
|
byte);
|
||||||
start = i + 1;
|
|
||||||
telnet->state = TELNET_STATE_DATA;
|
/* process what we've got */
|
||||||
|
_event(telnet, TELNET_EV_SUBNEGOTIATION, 0, telnet->sb_telopt,
|
||||||
|
telnet->buffer, telnet->buffer_pos);
|
||||||
|
|
||||||
|
/* recursive call to get the current input byte processed
|
||||||
|
* as a regular IAC command
|
||||||
|
*/
|
||||||
|
telnet->state = TELNET_STATE_IAC;
|
||||||
|
_process(telnet, (char *)&byte, 1);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
Loading…
Reference in New Issue