From c9422deb0b83a4e21ad3bb81495e8a9acf43664d Mon Sep 17 00:00:00 2001 From: Oliver Hartkopp Date: Sat, 8 Jun 2013 12:57:17 +0200 Subject: [PATCH] slcanpty: handle incomplete messages from pty correctly Make sure that we have minimum one complete SLCAN messages from pty in the receive buffer before we start processing the received SLCAN message. Fragments of a received incomplete message are stored to be appended by the next read() syscall in pty2can(). This patch is a rework of an initial patch from Ulrich Escher. Tnx! Reported-by: Ulrich Escher Signed-off-by: Oliver Hartkopp --- slcanpty.c | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/slcanpty.c b/slcanpty.c index 028bf21..dece1e1 100644 --- a/slcanpty.c +++ b/slcanpty.c @@ -73,8 +73,9 @@ int pty2can(int pty, int socket, struct can_filter *fi, int ptr; struct can_frame frame; int tmp, i; + static int rxoffset = 0; /* points to the end of an received incomplete SLCAN message */ - nbytes = read(pty, &buf, sizeof(buf)-1); + nbytes = read(pty, &buf[rxoffset], sizeof(buf)-rxoffset-1); if (nbytes <= 0) { /* nbytes == 0 : no error but pty decriptor has been closed */ if (nbytes < 0) @@ -83,6 +84,10 @@ int pty2can(int pty, int socket, struct can_filter *fi, return 1; } + /* reset incomplete message offset */ + nbytes += rxoffset; + rxoffset = 0; + rx_restart: /* remove trailing '\r' characters to be robust against some apps */ while (buf[0] == '\r' && nbytes > 0) { @@ -94,6 +99,21 @@ rx_restart: if (!nbytes) return 0; + /* check if we can detect a complete SLCAN message including '\r' */ + for (tmp = 0; tmp < nbytes; tmp++) { + if (buf[tmp] == '\r') + break; + } + + /* no '\r' found in the message buffer? */ + if (tmp == nbytes) { + /* save incomplete message */ + rxoffset = nbytes; + + /* leave here and read from pty again */ + return 0; + } + cmd = buf[0]; buf[nbytes] = 0; -- 2.39.2