Fix patty_kiss_tnc_recv() issues
Fix patty_kiss_tnc_recv() issues with small buffers (~330 bytes) by more properly detecting EOF being the condition at which the current decoder offset in the buffer is equal to the last buffer read size; the offset can never be the number of bytes read, and the initial read length is -1, so early EOF conditions are avoided
This commit is contained in:
parent
2e0adee54e
commit
d266058ad4
1 changed files with 8 additions and 23 deletions
23
src/kiss.c
23
src/kiss.c
|
@ -27,10 +27,7 @@ struct _patty_kiss_tnc {
|
||||||
offset,
|
offset,
|
||||||
dropped;
|
dropped;
|
||||||
|
|
||||||
ssize_t readlen,
|
ssize_t readlen;
|
||||||
left;
|
|
||||||
|
|
||||||
int eof;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
patty_kiss_tnc *patty_kiss_tnc_open_fd(int fd) {
|
patty_kiss_tnc *patty_kiss_tnc_open_fd(int fd) {
|
||||||
|
@ -48,9 +45,7 @@ patty_kiss_tnc *patty_kiss_tnc_open_fd(int fd) {
|
||||||
tnc->bufsz = PATTY_KISS_BUFSZ;
|
tnc->bufsz = PATTY_KISS_BUFSZ;
|
||||||
tnc->offset = 0;
|
tnc->offset = 0;
|
||||||
tnc->dropped = 0;
|
tnc->dropped = 0;
|
||||||
tnc->readlen = 0;
|
tnc->readlen = -1;
|
||||||
tnc->left = 0;
|
|
||||||
tnc->eof = 0;
|
|
||||||
|
|
||||||
return tnc;
|
return tnc;
|
||||||
|
|
||||||
|
@ -94,9 +89,7 @@ void patty_kiss_tnc_close(patty_kiss_tnc *tnc) {
|
||||||
|
|
||||||
static void tnc_drop(patty_kiss_tnc *tnc) {
|
static void tnc_drop(patty_kiss_tnc *tnc) {
|
||||||
tnc->offset = 0;
|
tnc->offset = 0;
|
||||||
tnc->readlen = 0;
|
tnc->readlen = -1;
|
||||||
tnc->left = 0;
|
|
||||||
tnc->eof = 0;
|
|
||||||
tnc->dropped++;
|
tnc->dropped++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -113,7 +106,7 @@ ssize_t patty_kiss_tnc_recv(patty_kiss_tnc *tnc,
|
||||||
|
|
||||||
enum kiss_flags flags = KISS_NONE;
|
enum kiss_flags flags = KISS_NONE;
|
||||||
|
|
||||||
if (tnc->eof) {
|
if (tnc->offset == tnc->readlen) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -139,8 +132,6 @@ ssize_t patty_kiss_tnc_recv(patty_kiss_tnc *tnc,
|
||||||
|
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
|
|
||||||
tnc->left = tnc->readlen;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
c = ((uint8_t *)tnc->buf)[tnc->offset++];
|
c = ((uint8_t *)tnc->buf)[tnc->offset++];
|
||||||
|
@ -220,12 +211,6 @@ done:
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
tnc->left -= r;
|
|
||||||
|
|
||||||
if (tnc->readlen < tnc->bufsz && tnc->left == 0) {
|
|
||||||
tnc->eof = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return (ssize_t)w;
|
return (ssize_t)w;
|
||||||
|
|
||||||
error_io:
|
error_io:
|
||||||
|
|
Loading…
Add table
Reference in a new issue