From 7622bfa9ec15e8f387a9561efb68380708230f85 Mon Sep 17 00:00:00 2001 From: Michal Bloch Date: Tue, 20 Mar 2018 14:56:38 +0100 Subject: [PATCH] Remove inplace KMSG parsing KMSG messages were parsed in-place, which made the process fragile and prone to break in case the log format was changed. Change-Id: Ie3517e172806bd54cdb3164578065cf9ab848426 Signed-off-by: Michal Bloch --- include/queued_entry.h | 2 +- src/logger/logger.c | 8 ++++---- src/shared/queued_entry.c | 28 ++++++++++------------------ src/tests/kmsg_parser.c | 17 +++++++++-------- 4 files changed, 24 insertions(+), 31 deletions(-) diff --git a/include/queued_entry.h b/include/queued_entry.h index 8387a60..e38554a 100644 --- a/include/queued_entry.h +++ b/include/queued_entry.h @@ -61,7 +61,7 @@ extern "C" { #endif void create_pipe_message(void * buf, int prio, char const * tag, char const * msg); -int parse_kmsg_message(char * buffer, int buffer_size); +int parse_kmsg_message(char *buffer, struct logger_entry_with_msg *lem, int buffer_size); int parse_syslog_datagram(const char * buffer, int buffer_size, struct logger_entry * le); void parse_androidlogger_message(struct android_logger_entry *ale, struct logger_entry *le, size_t dgram_size); void parse_pipe_message(struct pipe_logger_entry *ple, struct logger_entry *le, size_t msg_size); diff --git a/src/logger/logger.c b/src/logger/logger.c index 8e66385..b690751 100755 --- a/src/logger/logger.c +++ b/src/logger/logger.c @@ -1502,13 +1502,13 @@ static int service_writer_kmsg(struct logger* server, struct writer* wr, struct return -errno; wr->buffer[r] = '\0'; - if (parse_kmsg_message(wr->buffer, r)) { + struct logger_entry_with_msg lem; + if (parse_kmsg_message(wr->buffer, &lem, r)) { // don't signal an error: KMSG writer is too important to remove; besides, it would not get fixed that way. return 0; } - struct logger_entry * entry = (struct logger_entry*)wr->buffer; - add_recv_timestamp(entry); - return buffer_append(entry, wr->buf_ptr); + add_recv_timestamp(&lem.header); + return buffer_append(&lem.header, wr->buf_ptr); } /** diff --git a/src/shared/queued_entry.c b/src/shared/queued_entry.c index 4c3e0e5..064afa5 100644 --- a/src/shared/queued_entry.c +++ b/src/shared/queued_entry.c @@ -77,10 +77,8 @@ void create_pipe_message(void *buf, int prio, char const *tag, char const *msg) * @param[in] buffer_size The size of the input buffer * @return 0 on success, -errno on failure */ -int parse_kmsg_message(char * buffer, int buffer_size) +int parse_kmsg_message(char *buffer, struct logger_entry_with_msg *lem, int buffer_size) { - static char buffer_temp[LOG_MAX_PAYLOAD_SIZE]; - struct logger_entry le; unsigned long long timestamp; char * tag_begin, * pri_begin, * msg_begin; char *cptr; @@ -114,8 +112,8 @@ int parse_kmsg_message(char * buffer, int buffer_size) return -errno; // timestamp is in usec - le.sec = timestamp / (1000*1000); - le.nsec = 1000 * (timestamp % (1000 * 1000)); + lem->header.sec = timestamp / (1000*1000); + lem->header.nsec = 1000 * (timestamp % (1000 * 1000)); msg_begin = strchr(cptr+1, ';'); if (msg_begin == NULL) @@ -137,22 +135,16 @@ int parse_kmsg_message(char * buffer, int buffer_size) cptr++; } - le.pid = 0; - le.tid = 0; + lem->header.pid = 0; + lem->header.tid = 0; prio = strtol(pri_begin, NULL, 10); - struct logger_entry * buf_le = (struct logger_entry *) buffer; - buf_le->len = 1 + snprintf(buffer_temp, sizeof buffer_temp - 1, "%c%s", prio, tag_begin); - buf_le->len += 1 + snprintf(buffer_temp + buf_le->len, sizeof buffer_temp - 1 - buf_le->len, "%s", msg_begin); - - memcpy(buf_le->msg, buffer_temp, buf_le->len); - buf_le->len += sizeof(struct logger_entry); - buf_le->padding = 0; - buf_le->pid = le.pid; - buf_le->tid = le.tid; - buf_le->sec = le.sec; - buf_le->nsec = le.nsec; + lem->header.len = 1 + snprintf(lem->msg, sizeof lem->msg - 1, "%c%s", prio, tag_begin); + lem->header.len += 1 + snprintf(lem->msg + lem->header.len, sizeof lem->msg - 1 - lem->header.len, "%s", msg_begin); + + lem->header.len += sizeof(struct logger_entry); + lem->header.padding = 0; return 0; } diff --git a/src/tests/kmsg_parser.c b/src/tests/kmsg_parser.c index 799e0f2..172eff7 100644 --- a/src/tests/kmsg_parser.c +++ b/src/tests/kmsg_parser.c @@ -3,25 +3,26 @@ #include #include -void assert_result_buffer(char const *msg, int expected_outcome, char *buffer, int buf_size) +void assert_result_buffer(char const *msg, int expected_outcome, struct logger_entry_with_msg *lem) { - const int len = snprintf(buffer, buf_size, "%s", msg); - assert(parse_kmsg_message(buffer, len) == expected_outcome); + char buffer[LOG_MAX_PAYLOAD_SIZE]; + const int len = snprintf(buffer, sizeof buffer, "%s", msg); + assert(parse_kmsg_message(buffer, lem, len) == expected_outcome); } void assert_result(char const *msg, int expected_outcome) { - char buffer[4096]; - assert_result_buffer(msg, expected_outcome, buffer, sizeof buffer); + struct logger_entry_with_msg lem; + assert_result_buffer(msg, expected_outcome, &lem); } void assert_entry(char const * msg, log_entry expected) { - char buffer[4096]; - assert_result_buffer(msg, 0, buffer, sizeof buffer); + struct logger_entry_with_msg lem; + assert_result_buffer(msg, 0, &lem); log_entry le; - log_process_log_buffer((struct logger_entry *) buffer, &le); + log_process_log_buffer(&lem.header, &le); assert(expected.pid == le.pid); assert(expected.tid == le.tid); -- 2.7.4