Fix bug parsing KISS frames not for port 0

Fix bug parsing KISS frames not for port 0 in patty_kiss_tnc_drain();
furthermore, ensure frames are only handled when they are indeed for
port 0
This commit is contained in:
XANTRONIX Development 2020-10-05 00:19:11 -04:00 committed by XANTRONIX Industrial
parent 14354337cc
commit 6148977adf

View file

@ -41,6 +41,7 @@ struct _patty_kiss_tnc {
enum state state;
enum patty_kiss_command command;
int port;
size_t bufsz,
readlen,
@ -151,6 +152,7 @@ patty_kiss_tnc *patty_kiss_tnc_new(patty_kiss_tnc_info *info) {
tnc->opts = TNC_NONE;
tnc->state = KISS_NONE;
tnc->command = PATTY_KISS_RETURN;
tnc->port = 0;
tnc->bufsz = PATTY_KISS_TNC_BUFSZ;
tnc->offset_i = 0;
tnc->offset_o = 0;
@ -207,6 +209,8 @@ int patty_kiss_tnc_ready(patty_kiss_tnc *tnc, fd_set *fds) {
static void tnc_drop(patty_kiss_tnc *tnc) {
tnc->state = KISS_NONE;
tnc->command = PATTY_KISS_RETURN;
tnc->port = 0;
tnc->offset_i = 0;
tnc->offset_o = 0;
tnc->readlen = 0;
@ -247,12 +251,15 @@ ssize_t patty_kiss_tnc_drain(patty_kiss_tnc *tnc, void *buf, size_t len) {
break;
case KISS_FRAME_COMMAND:
if (c == PATTY_KISS_FEND) {
case KISS_FRAME_COMMAND: {
uint8_t command = PATTY_KISS_COMMAND(c),
port = PATTY_KISS_COMMAND_PORT(c);
if (command == PATTY_KISS_FEND) {
break;
}
switch (c) {
switch (command) {
case PATTY_KISS_DATA:
case PATTY_KISS_TXDELAY:
case PATTY_KISS_PERSISTENCE:
@ -270,16 +277,17 @@ ssize_t patty_kiss_tnc_drain(patty_kiss_tnc *tnc, void *buf, size_t len) {
}
tnc->state = KISS_FRAME_BODY;
tnc->command = (enum patty_kiss_command)c;
tnc->command = command;
tnc->port = port;
break;
}
case KISS_FRAME_BODY:
if (c == PATTY_KISS_FESC) {
tnc->state = KISS_FRAME_ESCAPE;
} else if (c == PATTY_KISS_FEND) {
tnc->state = KISS_FRAME_COMMAND;
tnc->command = PATTY_KISS_RETURN;
goto done;
} else {
@ -317,7 +325,10 @@ error_io:
}
int patty_kiss_tnc_pending(patty_kiss_tnc *tnc) {
return tnc->state == KISS_FRAME_COMMAND && tnc->offset_o > 0? 1: 0;
return tnc->state == KISS_FRAME_COMMAND
&& tnc->command == PATTY_KISS_DATA
&& tnc->port == 0
&& tnc->offset_o > 0? 1: 0;
}
ssize_t patty_kiss_tnc_flush(patty_kiss_tnc *tnc) {