From d44889121e7d620da31737d2f9315eda787cc76d Mon Sep 17 00:00:00 2001 From: XANTRONIX Development Date: Wed, 27 May 2020 19:11:25 -0400 Subject: [PATCH] Do not decode KISS frames into internal buffer Changes: * Modify patty_kiss_tnc_recv() to accept a pointer to a read buffer, and a maximum length argument, to receive one packet * Modify src/decode.c to use the new patty_kiss_tnc_recv() calling form --- include/patty/kiss.h | 5 +++-- src/decode.c | 23 +++++++++++++++++------ src/kiss.c | 23 ++++++----------------- 3 files changed, 26 insertions(+), 25 deletions(-) diff --git a/include/patty/kiss.h b/include/patty/kiss.h index eab42bf..059e169 100644 --- a/include/patty/kiss.h +++ b/include/patty/kiss.h @@ -40,11 +40,12 @@ void patty_kiss_tnc_close(patty_kiss_tnc *tnc); size_t patty_kiss_tnc_dropped(patty_kiss_tnc *tnc); ssize_t patty_kiss_tnc_recv(patty_kiss_tnc *tnc, - void **frame, + void *buf, + size_t len, int *port); ssize_t patty_kiss_tnc_send(patty_kiss_tnc *tnc, - const void *frame, + const void *buf, size_t len, int port); diff --git a/src/decode.c b/src/decode.c index c44cddf..3cadf79 100644 --- a/src/decode.c +++ b/src/decode.c @@ -142,7 +142,7 @@ error_io: int main(int argc, char **argv) { patty_kiss_tnc *tnc; - void *data; + void *buf; int port; if (argc != 2) { @@ -155,38 +155,49 @@ int main(int argc, char **argv) { goto error_kiss_tnc_open; } + if ((buf = malloc(PATTY_KISS_BUFSZ)) == NULL) { + perror("malloc()"); + + goto error_malloc_buf; + } + while (1) { ssize_t len; patty_ax25_frame frame; - if ((len = patty_kiss_tnc_recv(tnc, &data, &port)) < 0) { + if ((len = patty_kiss_tnc_recv(tnc, buf, PATTY_KISS_BUFSZ, &port)) < 0) { perror("Unable to read frame"); - goto error_ax25_frame_read; + goto error_kiss_tnc_recv; } else if (len == 0) { break; } - if (patty_ax25_frame_decode(&frame, data, len) < 0) { + if (patty_ax25_frame_decode(&frame, buf, len) < 0) { perror("Unable to decode frame"); goto error_ax25_frame_decode; } - if (frame_fprint(stdout, &frame, data, len) < 0) { + if (frame_fprint(stdout, &frame, buf, len) < 0) { perror("Unable to print frame"); goto error_frame_fprint; } } + free(buf); + patty_kiss_tnc_close(tnc); return 0; error_frame_fprint: error_ax25_frame_decode: -error_ax25_frame_read: +error_kiss_tnc_recv: + free(buf); + +error_malloc_buf: patty_kiss_tnc_close(tnc); error_kiss_tnc_open: diff --git a/src/kiss.c b/src/kiss.c index 6351ecb..105d94a 100644 --- a/src/kiss.c +++ b/src/kiss.c @@ -39,10 +39,6 @@ patty_kiss_tnc *patty_kiss_tnc_open_fd(int fd, size_t bufsz) { goto error_malloc_buf; } - if ((tnc->frame = malloc(bufsz)) == NULL) { - goto error_malloc_frame; - } - tnc->fd = fd; tnc->bufsz = bufsz; tnc->buflen = 0; @@ -50,9 +46,6 @@ patty_kiss_tnc *patty_kiss_tnc_open_fd(int fd, size_t bufsz) { return tnc; -error_malloc_frame: - free(tnc->buf); - error_malloc_buf: free(tnc); @@ -87,7 +80,6 @@ int patty_kiss_tnc_fd_unix(patty_kiss_tnc *tnc) { void patty_kiss_tnc_close(patty_kiss_tnc *tnc) { close(tnc->fd); - free(tnc->frame); free(tnc->buf); free(tnc); } @@ -130,7 +122,8 @@ size_t patty_kiss_tnc_dropped(patty_kiss_tnc *tnc) { } ssize_t patty_kiss_tnc_recv(patty_kiss_tnc *tnc, - void **frame, + void *buf, + size_t len, int *port) { size_t i = 0, b = 0; @@ -141,7 +134,7 @@ ssize_t patty_kiss_tnc_recv(patty_kiss_tnc *tnc, goto error_io; } - while (i < tnc->buflen) { + while (i < tnc->buflen && b < len) { uint8_t c = ((uint8_t *)tnc->buf)[i++]; if (!(flags & KISS_FRAME)) { @@ -189,12 +182,12 @@ ssize_t patty_kiss_tnc_recv(patty_kiss_tnc *tnc, } else { switch (c) { case PATTY_KISS_TFEND: - ((uint8_t *)tnc->frame)[b++] = PATTY_KISS_FEND; + ((uint8_t *)buf)[b++] = PATTY_KISS_FEND; flags &= ~KISS_ESCAPE; continue; case PATTY_KISS_TFESC: - ((uint8_t *)tnc->frame)[b++] = PATTY_KISS_FESC; + ((uint8_t *)buf)[b++] = PATTY_KISS_FESC; flags &= ~KISS_ESCAPE; continue; @@ -205,18 +198,14 @@ ssize_t patty_kiss_tnc_recv(patty_kiss_tnc *tnc, } } - ((uint8_t *)tnc->frame)[b++] = c; + ((uint8_t *)buf)[b++] = c; } done: if (flags & KISS_FRAME) { tnc_drop(tnc); - - *frame = NULL; } else { tnc_flush(tnc, i); - - *frame = tnc->frame; } return (ssize_t)b;