From: Mateusz Majewski Date: Fri, 5 Mar 2021 15:08:39 +0000 (+0100) Subject: Make the pipe daemon not drop stdin bytes X-Git-Tag: accepted/tizen/unified/20210328.230643~11^2~2 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=refs%2Fchanges%2F54%2F254654%2F1;p=platform%2Fcore%2Fsystem%2Fdlog.git Make the pipe daemon not drop stdin bytes 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 --- diff --git a/src/logger/log_buffer.c b/src/logger/log_buffer.c index 7ccabca..2386990 100644 --- a/src/logger/log_buffer.c +++ b/src/logger/log_buffer.c @@ -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;