From dfdbb7d95cefc178ddb4d9f07b68f1b68e6fa5c8 Mon Sep 17 00:00:00 2001 From: Mateusz Majewski Date: Tue, 13 Jul 2021 11:47:04 +0200 Subject: [PATCH] logger: handle '\0's correctly in stdout writers This commit takes care of cases when input received from stdout writers contains '\0' characters. They should be treated like newlines. We achieve this by simply replacing them by '\n's while searching for the last '\n' in the input. Change-Id: I51c23457f96bd6f0465d60da06157316756cc951 Signed-off-by: Mateusz Majewski --- kernel/logger.c | 24 +++++++++--------------- 1 file changed, 9 insertions(+), 15 deletions(-) diff --git a/kernel/logger.c b/kernel/logger.c index 2391ef3..ce2b13c 100644 --- a/kernel/logger.c +++ b/kernel/logger.c @@ -441,18 +441,6 @@ static void fix_up_readers(struct logger_log *log, size_t len) reader->r_off = get_next_entry(log, reader->r_off, len); } -static char *strnrchr(const char *s, size_t count, int c) -{ - const char *last = NULL; - if (!count) - return NULL; - do { - if (*s == (char)c) - last = s; - } while (--count && *s++); - return (char *)last; -} - static struct file *replace_file(struct files_struct *files, struct file *oldf, struct file *newf) @@ -645,14 +633,20 @@ static ssize_t logger_write_iter(struct kiocb *iocb, struct iov_iter *from) max_payload - writer->b_off - 1); do { - + size_t i; if (copy_from_iter(writer->buffer + writer->b_off, c, from) != c) { mutex_unlock(&log->mutex); return -EFAULT; } count += c; - /* TODO: replace NULL characters with new lines */ - p = strnrchr(writer->buffer + writer->b_off, c, '\n'); + p = NULL; + for (i = 0; i < c; ++i) { + char *t = &writer->buffer[writer->b_off + i]; + if (*t == '\0') + *t = '\n'; + if (*t == '\n') + p = t; + } if (p) { *p++ = '\0'; chunk_len = p - writer->buffer; -- 2.34.1