Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 24 May 2015 18:11:35 +0000
From:      bugzilla-noreply@freebsd.org
To:        freebsd-ports-bugs@FreeBSD.org
Subject:   [Bug 200429] sysutils/rsyslog8 endless loop when started at boot time with some rules to write on the console
Message-ID:  <bug-200429-13@https.bugs.freebsd.org/bugzilla/>

next in thread | raw e-mail | index | archive | help
https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=200429

            Bug ID: 200429
           Summary: sysutils/rsyslog8 endless loop when started at boot
                    time with some rules to write on the console
           Product: Ports & Packages
           Version: Latest
          Hardware: Any
                OS: Any
            Status: New
          Severity: Affects Many People
          Priority: ---
         Component: Individual Port(s)
          Assignee: brd@FreeBSD.org
          Reporter: fbsd.bugzilla@fenyo.net
             Flags: maintainer-feedback?(brd@FreeBSD.org)
          Assignee: brd@FreeBSD.org

Created attachment 157101
  --> https://bugs.freebsd.org/bugzilla/attachment.cgi?id=157101&action=edit
patch to correct the bug

Hi,

This bug report is about the four rsyslog ports: sysutils/rsyslog8,
sysutils/rsyslog7, sysutils/rsyslog8-devel, sysutils/rsyslog7-devel.

When rsyslog is started at boot time (for instance by setting
rsyslogd_enable="YES" in rc.conf(5), by adding "service rsyslogd onestart" in
rc.local(8), or by simply adding the daemon path and args in rc.local(8)), 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 the operating system, it will fail permanently, in an endless loop,
using 100% CPU.

Attached to this bug report, please find a patch to correct this behaviour. To
add this patch to the port, just add the file to the "files" directory. Note
that the patch is named *.c2 since another patch for the same file is currently
discussed in bug report 200270.

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

1- when init(8) launches rc(8) scripts, rsyslogd starts

2- rsyslogd reads rsyslog.conf(5) 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(2) 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(8) configures the console, and for this
to be done, it starts by calling the revoke(2) syscall: revoke("/dev/console")
is the first line of code in /usr/src/sbin/init/init.c:open_console().

4- Once /dev/console is revoked, further writes to any file descriptor
previously opened on this file return -1 with ENXIO as errno.

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,

-- 
You are receiving this mail because:
You are the assignee for the bug.



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?bug-200429-13>