From: Craig Small Date: Mon, 18 Jul 2022 10:16:42 +0000 (+1000) Subject: killall: use kill if pidfd_send_signal() fails X-Git-Tag: v23.6_rc1~15 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=6892e321e7042e3df60a5501a1c59d076e8a856f;p=psmisc killall: use kill if pidfd_send_signal() fails The pidfd_send_signal() system call appeared in Linux 5.1 If psmisc is build on a system before then, or a non-Linux system, then kill() is used instead. However if psmisc is built on a Linux >= 5.1 system but run on a < 5.1 Linux system the system call fails and killall doesn't work. The fix, as proposed by Peter T. Breuer, is to try pidfd_send_signal() and if the return value is < 0 and errno is ENOSYS then we know at runtime the system call failed and we fall through to trusty old kill(). Note, this means that killall on systems below 5.1 still have the race PID condition that the pidfd calls fix. References: https://bugs.debian.org/1015228 --- diff --git a/ChangeLog b/ChangeLog index ed9fb68..d539bc8 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,6 +1,7 @@ Changes in NEXT =============== * buildsys: Fix DEJAGNU work-around Debian #1015089 + * killall: Use kill if pidfd_send_signal fails Debian #1015228 Changes in 23.5 =============== diff --git a/src/killall.c b/src/killall.c index 78930c8..f573cfe 100644 --- a/src/killall.c +++ b/src/killall.c @@ -326,7 +326,12 @@ my_send_signal( { #ifdef __NR_pidfd_send_signal if (pid > 0) /* Not PGID */ - return syscall(__NR_pidfd_send_signal, pidfd, sig, NULL, 0); + { + int ret = syscall(__NR_pidfd_send_signal, pidfd, sig, NULL, 0); + if (ret >= 0 || errno != ENOSYS) + return ret; + // fall through if no such syscall + } #endif return kill(pid, sig); }