Make the pipe daemon not drop stdin bytes 54/254654/1
authorMateusz Majewski <m.majewski2@samsung.com>
Fri, 5 Mar 2021 15:08:39 +0000 (16:08 +0100)
committerMateusz Majewski <m.majewski2@samsung.com>
Fri, 5 Mar 2021 16:21:31 +0000 (17:21 +0100)
The daemon part of the stdin redirection wrongly assumed that the log
will always fit to the structure. If it didn't the part that fit was
written, but all bytes were removed from the input buffer, which
resulted in dropping all the extra bytes. This commit fixes that by
dropping the exact right amount of bytes.

Change-Id: I48fc9f80b2b617a442b5c5d654d474449a10af8c

src/logger/log_buffer.c

index 7ccabca..2386990 100644 (file)
@@ -103,13 +103,19 @@ static int service_writer_stdout(struct logger *server, struct writer *wr, struc
                        };
                        add_recv_timestamp(&lem.header, server->time);
 
-                       // TODO: I have no idea if the following is flawless, nor do I like it.
                        lem.header.tag_len = strlen(strncpy((char *)&lem + lem.header.len, wr->stdout_data->tag, sizeof(lem) - lem.header.len - 1));
                        lem.header.len += lem.header.tag_len + 1;
-                       if (sizeof(lem) - lem.header.len - 1 >= 1)
-                               lem.header.len += strlen(strncpy((char *)&lem + lem.header.len, wr->buffer, sizeof(lem) - lem.header.len - 1));
-                       if (sizeof(lem) > lem.header.len)
-                               lem.header.len += 1;
+                       assert(lem.header.len <= sizeof(lem));
+                       assert(((char *)&lem)[lem.header.len - 1] == '\0');
+                       int cut;
+                       if (sizeof(lem) - lem.header.len - 1 >= 1) {
+                               cut = strlen(strncpy((char *)&lem + lem.header.len, wr->buffer, sizeof(lem) - lem.header.len - 1));
+                               lem.header.len += cut + 1;
+                       }
+                       else
+                               return -EINVAL;
+                       assert(lem.header.len <= sizeof(lem));
+                       assert(((char *)&lem)[lem.header.len - 1] == '\0');
 
                        if (qos_is_enabled(&server->qos))
                                qos_add_log(&server->qos, &lem.header);
@@ -118,7 +124,8 @@ static int service_writer_stdout(struct logger *server, struct writer *wr, struc
                        if (r != 0)
                                return r;
 
-                       int cut = strlen(wr->buffer) + 1;
+                       if (wr->buffer[cut] == '\0')
+                               cut += 1;
                        if (cut == sizeof(wr->buffer)) {
                                // This will happen if the buffer was full.
                                wr->readed = 0;