From 00d292b2f5833740517cec829cc08531f85155e6 Mon Sep 17 00:00:00 2001 From: Romain Vimont Date: Thu, 4 Jun 2020 22:44:43 +0200 Subject: [PATCH] Fix receiver on partial device messages If a single device message was read in several chunks from the control socket, the communication was broken. --- app/src/receiver.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/app/src/receiver.c b/app/src/receiver.c index 8c8a7e03..bfe9d6e9 100644 --- a/app/src/receiver.c +++ b/app/src/receiver.c @@ -65,23 +65,24 @@ run_receiver(void *data) { for (;;) { assert(head < DEVICE_MSG_MAX_SIZE); - ssize_t r = net_recv(receiver->control_socket, buf, + ssize_t r = net_recv(receiver->control_socket, buf + head, DEVICE_MSG_MAX_SIZE - head); if (r <= 0) { LOGD("Receiver stopped"); break; } - ssize_t consumed = process_msgs(buf, r); + head += r; + ssize_t consumed = process_msgs(buf, head); if (consumed == -1) { // an error occurred break; } if (consumed) { + head -= consumed; // shift the remaining data in the buffer - memmove(buf, &buf[consumed], r - consumed); - head = r - consumed; + memmove(buf, &buf[consumed], head); } }