From: Lennart Poettering Date: Wed, 30 May 2012 13:42:35 +0000 (+0200) Subject: journald: ignore messages read from /proc/kmsg that we generated via /dev/kmsg X-Git-Tag: v184~17 X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=commitdiff_plain;h=6c3569e11aa1f658a9ef3f3c6efda4ae696e5aa8;ds=inline journald: ignore messages read from /proc/kmsg that we generated via /dev/kmsg Avoid a busy loop. --- diff --git a/TODO b/TODO index a9e38d347..434b66744 100644 --- a/TODO +++ b/TODO @@ -6,8 +6,6 @@ Fedora 18: * chrony/ntp target? Bugfixes: -* log_warning() in journald gets looped back into journal via kmsg? - * fix building of --disable-logind, hournald and coredunp pull-in parts of sd_login * remove MS_SHARED from src/core/execute.c and src/test/test-ns.c. They are always combined diff --git a/src/journal/journald.c b/src/journal/journald.c index 7776c2a25..5ecb7f72d 100644 --- a/src/journal/journald.c +++ b/src/journal/journald.c @@ -1768,6 +1768,17 @@ static int parse_kernel_timestamp(char **_p, usec_t *t) { return 1; } +static bool is_us(const char *pid) { + pid_t t; + + assert(pid); + + if (parse_pid(pid, &t) < 0) + return false; + + return t == getpid(); +} + static void proc_kmsg_line(Server *s, const char *p) { struct iovec iovec[N_IOVEC_META_FIELDS + 7]; char *message = NULL, *syslog_priority = NULL, *syslog_pid = NULL, *syslog_facility = NULL, *syslog_identifier = NULL, *source_time = NULL; @@ -1807,6 +1818,11 @@ static void proc_kmsg_line(Server *s, const char *p) { } else { read_identifier(&p, &identifier, &pid); + /* Avoid any messages we generated ourselves via + * log_info() and friends. */ + if (is_us(pid)) + goto finish; + if (s->forward_to_syslog) forward_syslog(s, priority, identifier, p, NULL, NULL); @@ -1832,6 +1848,7 @@ static void proc_kmsg_line(Server *s, const char *p) { dispatch_message(s, iovec, n, ELEMENTSOF(iovec), NULL, NULL, NULL, 0, priority); +finish: free(message); free(syslog_priority); free(syslog_identifier);