avoid restartable syscalls with siginterrupt() against all our handlers.
authordlg <dlg@openbsd.org>
Thu, 9 Nov 2023 18:36:19 +0000 (18:36 +0000)
committerdlg <dlg@openbsd.org>
Thu, 9 Nov 2023 18:36:19 +0000 (18:36 +0000)
commit79e44c4617ae39ac54daa85ea20638065d3afbd9
treebf8baa72efb1e354c3d8bef1846924d09126e322
parentfcdf327c18b9faeea5409fde689158e47f92b186
avoid restartable syscalls with siginterrupt() against all our handlers.

pflogd uses blocking bpf reads, but installs a bunch of signal
handlers to handle cleanly closing and (re)opening the log file.
signal() by default sets the handlers up so they're restartable.
this has the effect that when pflogd receives a signal while waiting
in bpfread, the signal handler runs and sets a flag saying the file
should be rotated or closed or whatever, but then the kernel restarts
the read.

when pflogd used a bpf read timeout, pflogd would run it's "event"
loop every time the read timeout expired. this meant even though
the bpf read was restarted, by having the read timeout expire every
500ms the flag the signal handlers set would be processed in a
relatively short period of time.

after moving bpf to a wait timeout, pflogd basically has to wait
for a packet to be captured before the bpf read will return. if
you're trying to kill pflogd on an idle firewall then you're basically
stuck.

making the signal handlers not restartable allows bpfread to fail
with EINTR so pflogd can go around it's even loop and exit as
expected.

reported by Mikhail on bugs@
ok claudio@

pflogd needs a rewrite though.
sbin/pflogd/pflogd.c