logger: fix data corruption for listening sockets 56/198156/1
authorMichal Bloch <m.bloch@samsung.com>
Mon, 21 Jan 2019 12:52:56 +0000 (13:52 +0100)
committerMichal Bloch <m.bloch@samsung.com>
Mon, 21 Jan 2019 12:54:31 +0000 (13:54 +0100)
The sockets are of the type SOCK_STREAM which can receive data
in chunks. This is quite unlikely due to small data sizes but
is not impossible.

Change-Id: I5efa42c52c58fcd913eb882a77641f595fc99e9e
Signed-off-by: Michal Bloch <m.bloch@samsung.com>
src/logger/logger.c

index ddf8507..e7126f0 100644 (file)
@@ -1504,17 +1504,18 @@ static int service_writer_socket(struct logger* server, struct writer* wr, struc
                if (r > 0)
                        wr->readed += r;
 
-               if (wr->readed < sizeof(msg->length))
-                       continue;
-
-               if (wr->readed < msg->length)
-                       continue;
+               /* The socket is SOCK_STREAM (see `listen_fd_create`), so one message
+                * could be split into chunks returned across multiple read() calls. */
+               if (wr->readed < sizeof(msg->length)
+               ||  wr->readed < msg->length)
+                       goto dont_process_yet_and_read_more_data;
 
                assert(wr->service_socket);
                r = wr->service_socket(server, wr, msg);
                if (r <= 0)
                        return r;
 
+dont_process_yet_and_read_more_data:
                r = read(wr->fd_entity.fd, wr->buffer + wr->readed, sizeof wr->buffer - wr->readed);
        } while (r > 0 || ((wr->readed >= sizeof(msg->length) && wr->readed >= msg->length)));