kmsg: allow binary characters
authorMichal Bloch <m.bloch@samsung.com>
Tue, 19 Jul 2016 15:58:54 +0000 (17:58 +0200)
committerSeung-Woo Kim <sw0312.kim@samsung.com>
Wed, 14 Dec 2016 04:52:17 +0000 (13:52 +0900)
* do not touch unprintable characters. This is so that logs can have formatting
  such as newlines, tabulation, or colours.
* the textual part is now delimited by \0. This is because \n which used to be
  the delimiter is now available for logs.
* NOTE: requires corresponding changes in dlogutil.

Signed-off-by: Michal Bloch <m.bloch@samsung.com>
Change-Id: Ib7a83241e7a72b2ba527f52801a8bae0698d18f4

kernel/printk/printk.c

index d6b9613..20ebf82 100644 (file)
@@ -989,15 +989,19 @@ static ssize_t kmsg_read(struct log_buffer *log_b, struct file *file,
                       user->seq, ts_usec, cont);
        user->prev = msg->flags;
 
-       /* escape non-printable characters */
        for (i = 0; i < msg->text_len; i++) {
                unsigned char c = log_text(msg)[i];
 
-               if (c < ' ' || c >= 127 || c == '\\')
-                       p += scnprintf(p, e - p, "\\x%02x", c);
-               else
-                       append_char(&p, e, c);
+               append_char(&p, e, c);
        }
+
+       /*
+        * The \0 is delimits the text part, while the newline is for formatting
+        * when catting the device directly. We cannot use \n for delimiting due
+        * to security: else one could forge dictionary tags through the message
+        * such as "text\n _PID=123"
+        */
+       append_char(&p, e, '\0');
        append_char(&p, e, '\n');
 
        if (msg->dict_len) {
@@ -1017,11 +1021,6 @@ static ssize_t kmsg_read(struct log_buffer *log_b, struct file *file,
                                continue;
                        }
 
-                       if (c < ' ' || c >= 127 || c == '\\') {
-                               p += scnprintf(p, e - p, "\\x%02x", c);
-                               continue;
-                       }
-
                        append_char(&p, e, c);
                }
                append_char(&p, e, '\n');