chiark / gitweb /
journald: properly update message size after stripping the identifier
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Sat, 13 Oct 2012 09:31:54 +0000 (11:31 +0200)
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Sat, 13 Oct 2012 12:40:32 +0000 (14:40 +0200)
Valgrind says:
==29176== Conditional jump or move depends on uninitialised value(s)
==29176==    at 0x412A85: cunescape_length_with_prefix (util.c:1565)
==29176==    by 0x40B351: dev_kmsg_record (journald-kmsg.c:301)
==29176==    by 0x40B653: server_read_dev_kmsg (journald-kmsg.c:347)
==29176==    by 0x40B701: server_flush_dev_kmsg (journald-kmsg.c:365)
==29176==    by 0x409DE7: main (journald.c:1535)

.gitignore
Makefile.am
src/journal/journald-kmsg.c
src/journal/journald-syslog.c
src/journal/journald-syslog.h
src/journal/test-journal-syslog.c [new file with mode: 0644]

index 71359ce..b9b333d 100644 (file)
@@ -17,6 +17,7 @@
 /build-aux
 /test-watchdog
 /test-journal-send
+/test-journal-syslog
 /systemd-multi-seat-x
 /systemd-cgtop
 /systemd-coredump
index 1c2514d..ebefac3 100644 (file)
@@ -2462,6 +2462,15 @@ test_journal_send_LDADD = \
        libsystemd-journal-internal.la \
        libsystemd-id128-internal.la
 
+test_journal_syslog_SOURCES = \
+       src/journal/test-journal-syslog.c \
+       src/journal/journald-syslog.c
+
+test_journal_syslog_LDADD = \
+       libsystemd-shared.la \
+       libsystemd-journal-internal.la \
+       libsystemd-id128-internal.la
+
 test_journal_match_SOURCES = \
        src/journal/test-journal-match.c
 
@@ -2595,6 +2604,7 @@ UNINSTALL_EXEC_HOOKS += \
 noinst_PROGRAMS += \
        test-journal \
        test-journal-send \
+       test-journal-syslog \
        test-journal-match \
        test-journal-stream \
        test-journal-verify \
@@ -2602,6 +2612,8 @@ noinst_PROGRAMS += \
 
 TESTS += \
        test-journal \
+       test-journal-send \
+       test-journal-syslog \
        test-journal-match \
        test-journal-stream \
        test-journal-verify \
index 4f5e7a0..548f653 100644 (file)
@@ -275,7 +275,7 @@ static void dev_kmsg_record(Server *s, char *p, size_t l) {
         if ((priority & LOG_FACMASK) == LOG_KERN)
                 IOVEC_SET_STRING(iovec[n++], "SYSLOG_IDENTIFIER=kernel");
         else {
-                syslog_parse_identifier((const char**) &p, &identifier, &pid);
+                pl -= syslog_parse_identifier((const char**) &p, &identifier, &pid);
 
                 /* Avoid any messages we generated ourselves via
                  * log_info() and friends. */
index d3e0f6f..c4f81b6 100644 (file)
@@ -185,7 +185,7 @@ int syslog_fixup_facility(int priority) {
         return priority;
 }
 
-void syslog_parse_identifier(const char **buf, char **identifier, char **pid) {
+size_t syslog_parse_identifier(const char **buf, char **identifier, char **pid) {
         const char *p;
         char *t;
         size_t l, e;
@@ -201,7 +201,7 @@ void syslog_parse_identifier(const char **buf, char **identifier, char **pid) {
 
         if (l <= 0 ||
             p[l-1] != ':')
-                return;
+                return 0;
 
         e = l;
         l--;
@@ -231,8 +231,9 @@ void syslog_parse_identifier(const char **buf, char **identifier, char **pid) {
         if (t)
                 *identifier = t;
 
+        e += strspn(p + e, WHITESPACE);
         *buf = p + e;
-        *buf += strspn(*buf, WHITESPACE);
+        return e;
 }
 
 void syslog_parse_priority(char **p, int *priority) {
index e009ab7..fa9de1a 100644 (file)
@@ -26,7 +26,7 @@
 int syslog_fixup_facility(int priority);
 
 void syslog_parse_priority(char **p, int *priority);
-void syslog_parse_identifier(const char **buf, char **identifier, char **pid);
+size_t syslog_parse_identifier(const char **buf, char **identifier, char **pid);
 
 void server_forward_syslog(Server *s, int priority, const char *identifier, const char *message, struct ucred *ucred, struct timeval *tv);
 
diff --git a/src/journal/test-journal-syslog.c b/src/journal/test-journal-syslog.c
new file mode 100644 (file)
index 0000000..3ae8633
--- /dev/null
@@ -0,0 +1,44 @@
+/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
+
+/***
+  This file is part of systemd.
+
+  Copyright 2011 Lennart Poettering
+
+  systemd is free software; you can redistribute it and/or modify it
+  under the terms of the GNU Lesser General Public License as published by
+  the Free Software Foundation; either version 2.1 of the License, or
+  (at your option) any later version.
+
+  systemd is distributed in the hope that it will be useful, but
+  WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+  Lesser General Public License for more details.
+
+  You should have received a copy of the GNU Lesser General Public License
+  along with systemd; If not, see <http://www.gnu.org/licenses/>.
+***/
+
+#include "journald-syslog.h"
+#include "macro.h"
+
+static void test_syslog_parse_identifier(const char* str,
+                                         const char *ident, const char*pid, int ret) {
+        const char *buf = str;
+        char *ident2 = NULL, *pid2 = NULL;
+        int ret2;
+
+        ret2 = syslog_parse_identifier(&buf, &ident2, &pid2);
+
+        assert(ret == ret2);
+        assert(ident==ident2 || !strcmp(ident, ident2));
+        assert(pid==pid2 || !strcmp(pid, pid2));
+}
+
+int main(void) {
+        test_syslog_parse_identifier("pidu[111]: xxx", "pidu", "111", 11);
+        test_syslog_parse_identifier("pidu: xxx", "pidu", NULL, 6);
+        test_syslog_parse_identifier("pidu xxx", NULL, NULL, 0);
+
+        return 0;
+}