change behavior of invalid IAC sequence inside subnegotiation to match BSD telnet implementation
diff --git a/libtelnet.c b/libtelnet.c
index 8478803..cbdb44c 100644
--- a/libtelnet.c
+++ b/libtelnet.c
@@ -472,8 +472,7 @@
return TELNET_EOK;
}
-static void _process(telnet_t *telnet, const char *buffer,
- size_t size) {
+static void _process(telnet_t *telnet, const char *buffer, size_t size) {
unsigned char byte;
size_t i, start;
for (i = start = 0; i != size; ++i) {
@@ -601,13 +600,24 @@
telnet->state = TELNET_STATE_SB_DATA;
}
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:
_error(telnet, __LINE__, __func__, TELNET_EPROTOCOL, 0,
"unexpected byte after IAC inside SB: %d",
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;