mirror of
https://github.com/clearlinux/systemd-stable.git
synced 2026-10-03 23:38:39 +00:00
journald: properly unescape messages from /dev/kmsg
This commit is contained in:
@@ -1815,6 +1815,7 @@ static void dev_kmsg_record(Server *s, char *p, size_t l) {
|
||||
usec_t usec;
|
||||
char *identifier = NULL, *pid = NULL, *e, *f, *k;
|
||||
uint64_t serial;
|
||||
size_t pl;
|
||||
|
||||
assert(s);
|
||||
assert(p);
|
||||
@@ -1867,6 +1868,7 @@ static void dev_kmsg_record(Server *s, char *p, size_t l) {
|
||||
return;
|
||||
*e = 0;
|
||||
|
||||
pl = e - p;
|
||||
l -= (e - p) + 1;
|
||||
k = e + 1;
|
||||
|
||||
@@ -1885,16 +1887,12 @@ static void dev_kmsg_record(Server *s, char *p, size_t l) {
|
||||
|
||||
*e = 0;
|
||||
|
||||
m = new(char, sizeof("_KERNEL_") - 1 + e - k);
|
||||
m = cunescape_length_with_prefix(k, e - k, "_KERNEL_");
|
||||
if (!m)
|
||||
break;
|
||||
|
||||
memcpy(m, "_KERNEL_", sizeof("_KERNEL_") - 1);
|
||||
memcpy(m + sizeof("_KERNEL_") - 1, k, e - k);
|
||||
|
||||
iovec[n].iov_base = m;
|
||||
iovec[n].iov_len = sizeof("_KERNEL_") - 1 + e - k;
|
||||
n++, z++;
|
||||
IOVEC_SET_STRING(iovec[n++], m);
|
||||
z++;
|
||||
|
||||
l -= (e - k) + 1;
|
||||
k = e + 1;
|
||||
@@ -1935,7 +1933,7 @@ static void dev_kmsg_record(Server *s, char *p, size_t l) {
|
||||
IOVEC_SET_STRING(iovec[n++], syslog_facility);
|
||||
}
|
||||
|
||||
message = strappend("MESSAGE=", p);
|
||||
message = cunescape_length_with_prefix(p, pl, "MESSAGE=");
|
||||
if (message)
|
||||
IOVEC_SET_STRING(iovec[n++], message);
|
||||
|
||||
|
||||
+16
-4
@@ -1562,19 +1562,25 @@ char *cescape(const char *s) {
|
||||
return r;
|
||||
}
|
||||
|
||||
char *cunescape_length(const char *s, size_t length) {
|
||||
char *cunescape_length_with_prefix(const char *s, size_t length, const char *prefix) {
|
||||
char *r, *t;
|
||||
const char *f;
|
||||
size_t pl;
|
||||
|
||||
assert(s);
|
||||
|
||||
/* Undoes C style string escaping */
|
||||
/* Undoes C style string escaping, and optionally prefixes it. */
|
||||
|
||||
r = new(char, length+1);
|
||||
pl = prefix ? strlen(prefix) : 0;
|
||||
|
||||
r = new(char, pl+length+1);
|
||||
if (!r)
|
||||
return r;
|
||||
|
||||
for (f = s, t = r; f < s + length; f++) {
|
||||
if (prefix)
|
||||
memcpy(r, prefix, pl);
|
||||
|
||||
for (f = s, t = r + pl; f < s + length; f++) {
|
||||
|
||||
if (*f != '\\') {
|
||||
*(t++) = *f;
|
||||
@@ -1685,7 +1691,13 @@ finish:
|
||||
return r;
|
||||
}
|
||||
|
||||
char *cunescape_length(const char *s, size_t length) {
|
||||
return cunescape_length_with_prefix(s, length, NULL);
|
||||
}
|
||||
|
||||
char *cunescape(const char *s) {
|
||||
assert(s);
|
||||
|
||||
return cunescape_length(s, strlen(s));
|
||||
}
|
||||
|
||||
|
||||
@@ -256,6 +256,7 @@ int undecchar(char c);
|
||||
char *cescape(const char *s);
|
||||
char *cunescape(const char *s);
|
||||
char *cunescape_length(const char *s, size_t length);
|
||||
char *cunescape_length_with_prefix(const char *s, size_t length, const char *prefix);
|
||||
|
||||
char *xescape(const char *s, const char *bad);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user