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
Changes in NEXT
===============
* buildsys: Fix DEJAGNU work-around Debian #1015089
+ * killall: Use kill if pidfd_send_signal fails Debian #1015228
Changes in 23.5
===============
{
#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);
}