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];
- append_char(&p, e, c);
+ if (c < ' ' || c >= 127 || c == '\\')
+ p += scnprintf(p, e - p, "\\x%02x", c);
+ else
+ 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) {
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');