|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
From 6a4bb8712d25a3e8e4700c7a3c6c9bd614c74d7f Mon Sep 17 00:00:00 2001
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl>
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
Date: Fri, 19 May 2017 11:59:47 -0400
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
Subject: [PATCH] journald: process "binary" fields the same as text fields
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
MESSAGE=data\n and MESSAGE\n40000000data\n are both valid serializations, so
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
they should be stored in the journal. Before, MESSAGE, SYSLOG_FACILITY,
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
SYSLOG_IDENTIFIER, PRIORITY, and OBJECT_PID would be only honoured if they were
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
given in the first form.
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
Fixed #5973.
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
(cherry picked from commit 4b29a7f41fa1f418520d66362fd904a504f67c02)
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
---
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
src/journal/journald-native.c | 120 ++++++++++++++++++++++++------------------
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
1 file changed, 70 insertions(+), 50 deletions(-)
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
diff --git a/src/journal/journald-native.c b/src/journal/journald-native.c
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
index 83250c34e1..db3fdcf1df 100644
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
--- a/src/journal/journald-native.c
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
+++ b/src/journal/journald-native.c
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
@@ -81,6 +81,64 @@ static bool allow_object_pid(const struct ucred *ucred) {
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
return ucred && ucred->uid == 0;
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
}
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
+static void server_process_entry_meta(
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
+ const char *p, size_t l,
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
+ const struct ucred *ucred,
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
+ int *priority,
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
+ char **identifier,
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
+ char **message,
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
+ pid_t *object_pid) {
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
+ /* We need to determine the priority of this entry for the rate limiting logic */
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
+ if (l == 10 &&
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
+ startswith(p, "PRIORITY=") &&
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
+ p[9] >= '0' && p[9] <= '9')
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
+ *priority = (*priority & LOG_FACMASK) | (p[9] - '0');
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
+ else if (l == 17 &&
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
+ startswith(p, "SYSLOG_FACILITY=") &&
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
+ p[16] >= '0' && p[16] <= '9')
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
+ *priority = (*priority & LOG_PRIMASK) | ((p[16] - '0') << 3);
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
+ else if (l == 18 &&
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
+ startswith(p, "SYSLOG_FACILITY=") &&
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
+ p[16] >= '0' && p[16] <= '9' &&
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
+ p[17] >= '0' && p[17] <= '9')
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
+ *priority = (*priority & LOG_PRIMASK) | (((p[16] - '0')*10 + (p[17] - '0')) << 3);
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
+ else if (l >= 19 &&
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
+ startswith(p, "SYSLOG_IDENTIFIER=")) {
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
+ char *t;
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
+ t = strndup(p + 18, l - 18);
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
+ if (t) {
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
+ free(*identifier);
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
+ *identifier = t;
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
+ }
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
+ } else if (l >= 8 &&
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
+ startswith(p, "MESSAGE=")) {
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
+ char *t;
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
+ t = strndup(p + 8, l - 8);
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
+ if (t) {
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
+ free(*message);
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
+ *message = t;
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
+ }
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
+ } else if (l > strlen("OBJECT_PID=") &&
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
+ l < strlen("OBJECT_PID=") + DECIMAL_STR_MAX(pid_t) &&
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
+ startswith(p, "OBJECT_PID=") &&
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
+ allow_object_pid(ucred)) {
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
+ char buf[DECIMAL_STR_MAX(pid_t)];
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
+ memcpy(buf, p + strlen("OBJECT_PID="), l - strlen("OBJECT_PID="));
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
+ buf[l-strlen("OBJECT_PID=")] = '\0';
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
+ (void) parse_pid(buf, object_pid);
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
+ }
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
+}
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
static int server_process_entry(
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
Server *s,
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
const void *buffer, size_t *remaining,
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
@@ -148,62 +206,18 @@ static int server_process_entry(
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
/* If the field name starts with an
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
* underscore, skip the variable,
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
- * since that indidates a trusted
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
+ * since that indicates a trusted
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
* field */
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
iovec[n].iov_base = (char*) p;
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
iovec[n].iov_len = l;
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
entry_size += l;
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
n++;
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
- /* We need to determine the priority
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
- * of this entry for the rate limiting
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
- * logic */
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
- if (l == 10 &&
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
- startswith(p, "PRIORITY=") &&
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
- p[9] >= '0' && p[9] <= '9')
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
- priority = (priority & LOG_FACMASK) | (p[9] - '0');
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
-
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
- else if (l == 17 &&
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
- startswith(p, "SYSLOG_FACILITY=") &&
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
- p[16] >= '0' && p[16] <= '9')
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
- priority = (priority & LOG_PRIMASK) | ((p[16] - '0') << 3);
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
-
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
- else if (l == 18 &&
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
- startswith(p, "SYSLOG_FACILITY=") &&
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
- p[16] >= '0' && p[16] <= '9' &&
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
- p[17] >= '0' && p[17] <= '9')
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
- priority = (priority & LOG_PRIMASK) | (((p[16] - '0')*10 + (p[17] - '0')) << 3);
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
-
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
- else if (l >= 19 &&
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
- startswith(p, "SYSLOG_IDENTIFIER=")) {
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
- char *t;
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
-
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
- t = strndup(p + 18, l - 18);
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
- if (t) {
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
- free(identifier);
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
- identifier = t;
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
- }
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
-
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
- } else if (l >= 8 &&
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
- startswith(p, "MESSAGE=")) {
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
- char *t;
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
-
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
- t = strndup(p + 8, l - 8);
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
- if (t) {
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
- free(message);
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
- message = t;
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
- }
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
-
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
- } else if (l > strlen("OBJECT_PID=") &&
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
- l < strlen("OBJECT_PID=") + DECIMAL_STR_MAX(pid_t) &&
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
- startswith(p, "OBJECT_PID=") &&
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
- allow_object_pid(ucred)) {
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
- char buf[DECIMAL_STR_MAX(pid_t)];
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
- memcpy(buf, p + strlen("OBJECT_PID="), l - strlen("OBJECT_PID="));
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
- buf[l-strlen("OBJECT_PID=")] = '\0';
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
-
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
- (void) parse_pid(buf, &object_pid);
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
- }
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
+ server_process_entry_meta(p, l, ucred,
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
+ &priority,
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
+ &identifier,
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
+ &message,
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
+ &object_pid);
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
}
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
*remaining -= (e - p) + 1;
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
@@ -246,6 +260,12 @@ static int server_process_entry(
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
iovec[n].iov_len = (e - p) + 1 + l;
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
entry_size += iovec[n].iov_len;
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
n++;
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
+ server_process_entry_meta(k, (e - p) + 1 + l, ucred,
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
+ &priority,
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
+ &identifier,
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
+ &message,
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
+ &object_pid);
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
} else
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
free(k);
|
|
Zbigniew Jędrzejewski-Szmek |
f4a676 |
|