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:
parent
14354337cc
commit
6148977adf
1 changed files with 18 additions and 7 deletions
23
src/tnc.c
23
src/tnc.c
|
@ -41,6 +41,7 @@ struct _patty_kiss_tnc {
|
||||||
|
|
||||||
enum state state;
|
enum state state;
|
||||||
enum patty_kiss_command command;
|
enum patty_kiss_command command;
|
||||||
|
int port;
|
||||||
|
|
||||||
size_t bufsz,
|
size_t bufsz,
|
||||||
readlen,
|
readlen,
|
||||||
|
@ -151,6 +152,7 @@ patty_kiss_tnc *patty_kiss_tnc_new(patty_kiss_tnc_info *info) {
|
||||||
tnc->opts = TNC_NONE;
|
tnc->opts = TNC_NONE;
|
||||||
tnc->state = KISS_NONE;
|
tnc->state = KISS_NONE;
|
||||||
tnc->command = PATTY_KISS_RETURN;
|
tnc->command = PATTY_KISS_RETURN;
|
||||||
|
tnc->port = 0;
|
||||||
tnc->bufsz = PATTY_KISS_TNC_BUFSZ;
|
tnc->bufsz = PATTY_KISS_TNC_BUFSZ;
|
||||||
tnc->offset_i = 0;
|
tnc->offset_i = 0;
|
||||||
tnc->offset_o = 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) {
|
static void tnc_drop(patty_kiss_tnc *tnc) {
|
||||||
tnc->state = KISS_NONE;
|
tnc->state = KISS_NONE;
|
||||||
|
tnc->command = PATTY_KISS_RETURN;
|
||||||
|
tnc->port = 0;
|
||||||
tnc->offset_i = 0;
|
tnc->offset_i = 0;
|
||||||
tnc->offset_o = 0;
|
tnc->offset_o = 0;
|
||||||
tnc->readlen = 0;
|
tnc->readlen = 0;
|
||||||
|
@ -247,12 +251,15 @@ ssize_t patty_kiss_tnc_drain(patty_kiss_tnc *tnc, void *buf, size_t len) {
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case KISS_FRAME_COMMAND:
|
case KISS_FRAME_COMMAND: {
|
||||||
if (c == PATTY_KISS_FEND) {
|
uint8_t command = PATTY_KISS_COMMAND(c),
|
||||||
|
port = PATTY_KISS_COMMAND_PORT(c);
|
||||||
|
|
||||||
|
if (command == PATTY_KISS_FEND) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (c) {
|
switch (command) {
|
||||||
case PATTY_KISS_DATA:
|
case PATTY_KISS_DATA:
|
||||||
case PATTY_KISS_TXDELAY:
|
case PATTY_KISS_TXDELAY:
|
||||||
case PATTY_KISS_PERSISTENCE:
|
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->state = KISS_FRAME_BODY;
|
||||||
tnc->command = (enum patty_kiss_command)c;
|
tnc->command = command;
|
||||||
|
tnc->port = port;
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
case KISS_FRAME_BODY:
|
case KISS_FRAME_BODY:
|
||||||
if (c == PATTY_KISS_FESC) {
|
if (c == PATTY_KISS_FESC) {
|
||||||
tnc->state = KISS_FRAME_ESCAPE;
|
tnc->state = KISS_FRAME_ESCAPE;
|
||||||
} else if (c == PATTY_KISS_FEND) {
|
} else if (c == PATTY_KISS_FEND) {
|
||||||
tnc->state = KISS_FRAME_COMMAND;
|
tnc->state = KISS_FRAME_COMMAND;
|
||||||
tnc->command = PATTY_KISS_RETURN;
|
|
||||||
|
|
||||||
goto done;
|
goto done;
|
||||||
} else {
|
} else {
|
||||||
|
@ -317,7 +325,10 @@ error_io:
|
||||||
}
|
}
|
||||||
|
|
||||||
int patty_kiss_tnc_pending(patty_kiss_tnc *tnc) {
|
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) {
|
ssize_t patty_kiss_tnc_flush(patty_kiss_tnc *tnc) {
|
||||||
|
|
Loading…
Add table
Reference in a new issue