Hi,

Here is a bug report about rsyslog. A patch is attached to correct this bug.
It occurs only on FreeBSD. I've already sent a bug report on the FreeBSD 
reporting tool: https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=200429

I'm sending this mail on this list for the patch to be included in the 
mainstream distribution of rsyslog.

Here is the description of the bug:
When rsyslog is started at boot time on FreeBSD (by means of rc scripts or 
/etc/rc.local), and when rsyslog is simultaneously configured to output some 
streams to "/dev/console", the daemon will start correctly but, at the near end 
of the boot sequence of FreeBSD, it will fail permanently, in an endless loop, 
using 100% CPU.

Attached to this bug report, please find a patch to correct this behaviour.

Here is a complete explanation of the steps that make the bug happen:

1- when init launches rc scripts, rsyslogd starts

2- rsyslogd reads rsyslog.conf and if some stuff must be logged to the console, 
because of a line like "*.err;kern.warning;auth.notice;mail.crit /dev/console" 
in the configuration file, the daemon calls open to get a file descriptor to 
write on "/dev/console". It starts writing corresponding logs to this 
descriptor.

3- Later during the boot sequence, init configures the console, and for this to 
be done, it starts by calling the revoke syscall: revoke("/dev/console").

4- Once /dev/console is revoked, further writes to any file descriptor 
previously opened on this file return -1 with ENXIO as errno, even if this 
descriptor was opened in another process than init.

5- thus, rsyslogd gets this error in runtime/stream.c:doWriteCall(), and calls 
runtime/stream.c:tryTTYRecover() since the error occured on a tty.

6- but runtime/stream.c:tryTTYRecover() tries to reopen the tty only if the 
error is EIO on Linux or EBADF on any other operating system. Since the error 
is ENXIO, that is distinct from EBADF, runtime/stream.c:tryTTYRecover() returns 
RS_RET_OK and runtime/stream.c:doWriteCall() loops, endlessly.

Sincerely,


--- runtime/stream.c.orig       2015-05-24 18:22:24.660946067 +0200
+++ runtime/stream.c    2015-05-24 18:29:47.144801920 +0200
@@ -997,7 +997,11 @@
 {
        DEFiRet;
        ISOBJ_TYPE_assert(pThis, strm);
+#ifndef __FreeBSD__
        if(err == ERR_TTYHUP) {
+#else
+       if(err == ERR_TTYHUP || err == ENXIO) {
+#endif /* __FreeBSD__ */
                close(pThis->fd);
                CHKiRet(doPhysOpen(pThis));
        }
_______________________________________________
rsyslog mailing list
http://lists.adiscon.net/mailman/listinfo/rsyslog
http://www.rsyslog.com/professional-services/
What's up with rsyslog? Follow https://twitter.com/rgerhards
NOTE WELL: This is a PUBLIC mailing list, posts are ARCHIVED by a myriad of 
sites beyond our control. PLEASE UNSUBSCRIBE and DO NOT POST if you DON'T LIKE 
THAT.

Reply via email to