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