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