Page MenuHomeFreeBSD

syslogd: Watch for dead pipe processes
Needs ReviewPublic

Authored by jfree on Aug 16 2023, 12:10 AM.
Tags
None
Referenced Files
Unknown Object (File)
Sat, Jun 22, 7:24 PM
Unknown Object (File)
May 3 2024, 6:55 AM
Unknown Object (File)
Apr 25 2024, 4:20 AM
Unknown Object (File)
Apr 24 2024, 1:56 PM
Unknown Object (File)
Apr 23 2024, 4:57 AM
Unknown Object (File)
Apr 23 2024, 12:14 AM
Unknown Object (File)
Apr 22 2024, 7:01 PM
Unknown Object (File)
Apr 6 2024, 8:02 AM

Details

Reviewers
markj
Summary
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.

Diff Detail

Repository
rG FreeBSD src repository
Lint
Lint Skipped
Unit
Tests Skipped

Event Timeline

Add boolean reload parameter to close_filed(). When set to true, remove kevents that reference the filed.

Remove reload parameter in close_filed(). Move kqueue deletion into closelogfiles() instead.

Update after rebase conflicts

usr.sbin/syslogd/syslogd.c
2499

What's the point of deleting the kevent if we're about to close the fd anyway? Does that simplify cleanup somehow?

usr.sbin/syslogd/syslogd.c
2499

What's the point of deleting the kevent if we're about to close the fd anyway? Does that simplify cleanup somehow?

If we're reloading, it is possible that piped processes are still alive. In init(), this closelogfiles() is called and all fileds are freed. If we don't remove the piped process' kevent from the kqueue, then EVFILT_PROCDESC will be triggered upon the procdesc closure in close_filed(). Back in main(), the EVFILT_PROCDESC will attempt to call close_filed() again with an invalid, freed filed (stored in its udata).

This revision is now accepted and ready to land.Aug 23 2023, 3:50 PM

Update to avoid rebase conflicts.

This revision now requires review to proceed.Sep 3 2023, 3:27 AM