https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=291557

            Bug ID: 291557
           Summary: syslogd immediately kills process started with pipe
           Product: Base System
           Version: 15.0-RELEASE
          Hardware: Any
                OS: Any
            Status: New
          Severity: Affects Some People
          Priority: ---
         Component: bin
          Assignee: [email protected]
          Reporter: [email protected]

Starting from 15.0-RELEASE, syslogd immediately kills process started with pipe
instead of close the pipe and wait for the process exit.

Steps to reproduce:

1. Create script named pipe-test:
--------------------------------------------------
#!/bin/sh
logger -p local3.warning -t pipe-test "$$ START"
while read msg; do
    logger -p local3.warning -t pipe-test "$$ ${msg}"
done
logger -p local3.warning -t pipe-test "$$ END"
exit 0
--------------------------------------------------

2. Add it to configuration of syslogd:
local2.* |exec /home/user/pipe-test

3. Apply new config:
killall -1 syslogd

4. Send message to syslog:
logger -p local2.warning -t logger message1

5. Reread syslogd config to restart pipe-test script:
killall -1 syslogd

6. Send message to syslog again:
logger -p local2.warning -t logger message2

As a result, we got in /var/log/messages:
Dec 10 20:37:24 host logger[77378]: message1
Dec 10 20:37:24 host pipe-test[77383]: 77379 START
Dec 10 20:37:24 host pipe-test[77387]: 77379 Dec 10 20:37:24 host
logger[77378]: message1
Dec 10 20:37:29 host logger[77400]: message2
Dec 10 20:37:29 host pipe-test[77405]: 77401 START
Dec 10 20:37:29 host pipe-test[77409]: 77401 Dec 10 20:37:29 host
logger[77400]: message2

pipe-test script never prints "END" and never reaches exit.

The problem is caused by this commit:

commit d2d180fb77362eb1381ada9edefe4332be776bf2
Author: Jake Freeland <[email protected]>
Date:   Wed Nov 27 16:26:02 2024 -0600

    syslogd: Watch for dead pipe processes

    For each new pipe process, add its process descriptor into the kqueue
    with the EVFILT_PROCDESC filter and NOTE_EXIT event. When the pipe
    process exits, the main kqueue loop will catch this, logging exit errors
    and cleaning up the pipe process' filed node.

    Reviewed by:    markj
    Differential Revision:  https://reviews.freebsd.org/D41477

Applying reverse patch and rebuilding syslogd fixes the issue.

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

Reply via email to