diff options
author | iedowse <iedowse@FreeBSD.org> | 2004-01-26 00:46:46 +0000 |
---|---|---|
committer | iedowse <iedowse@FreeBSD.org> | 2004-01-26 00:46:46 +0000 |
commit | 5c3a320f7bc55fbee840d0c6ff22136bfcda9c80 (patch) | |
tree | ed870542c76896b525b926dba8de9d4a48e9a5df /usr.sbin/syslogd | |
parent | 507ddae3aa5dc64a575ea9aeadcd62dca43ba515 (diff) | |
download | FreeBSD-src-5c3a320f7bc55fbee840d0c6ff22136bfcda9c80.zip FreeBSD-src-5c3a320f7bc55fbee840d0c6ff22136bfcda9c80.tar.gz |
Be much more strict about parsing tagged log messages from /dev/klog;
if the line doesn't match ^<%d>, then treat it as a regular kernel
printf line. Previously if a kernel printf message started with "<"
it would be interpreted as a log message, often with LOG_EMERG
level. This was triggered by some printfs in sys/dev/aic7xxx/, and
can also happen with the partial lines that result if syslogd cannot
keep up with the rate of arrival of kernel messages.
Reviewed by: dwmalone
MFC after: 1 week
Diffstat (limited to 'usr.sbin/syslogd')
-rw-r--r-- | usr.sbin/syslogd/syslogd.c | 30 |
1 files changed, 20 insertions, 10 deletions
diff --git a/usr.sbin/syslogd/syslogd.c b/usr.sbin/syslogd/syslogd.c index c47dfa9..0acb9ff 100644 --- a/usr.sbin/syslogd/syslogd.c +++ b/usr.sbin/syslogd/syslogd.c @@ -734,24 +734,34 @@ readklog(void) * Take a raw input line from /dev/klog, format similar to syslog(). */ static void -printsys(char *p) +printsys(char *msg) { - int pri, flags; + char *p; + int flags, isprintf, n, pri; flags = ISKERNEL | SYNC_FILE | ADDDATE; /* fsync after write */ pri = DEFSPRI; + p = msg; + isprintf = 1; if (*p == '<') { - pri = 0; + n = 0; while (isdigit(*++p)) - pri = 10 * pri + (*p - '0'); - if (*p == '>') + n = 10 * n + (*p - '0'); + if (*p == '>') { ++p; - if ((pri & LOG_FACMASK) == LOG_CONSOLE) - flags |= IGN_CONS; - } else { - /* kernel printf's come out on console */ - flags |= IGN_CONS; + pri = n; + isprintf = 0; + } else { + /* It wasn't actually a syslog message. */ + p = msg; + } } + /* + * Kernel printf's and LOG_CONSOLE messages have been displayed + * on the console already. + */ + if (isprintf || (pri & LOG_FACMASK) == LOG_CONSOLE) + flags |= IGN_CONS; if (pri &~ (LOG_FACMASK|LOG_PRIMASK)) pri = DEFSPRI; logmsg(pri, p, LocalHostName, flags); |