summaryrefslogtreecommitdiff
path: root/sys-process/psmisc/files
diff options
context:
space:
mode:
authorV3n3RiX <venerix@koprulu.sector>2022-10-28 09:59:10 +0100
committerV3n3RiX <venerix@koprulu.sector>2022-10-28 09:59:10 +0100
commit8eb973cc2247ee4fe34e4d907fdc6cf5b94709e3 (patch)
tree0834df6dbfa798c2c138698cc26cf6a731fe937e /sys-process/psmisc/files
parente5985b8e66b3b43c34328efb47b9b12e8ce5a690 (diff)
gentoo auto-resync : 28:10:2022 - 09:59:10
Diffstat (limited to 'sys-process/psmisc/files')
-rw-r--r--sys-process/psmisc/files/psmisc-23.5-fix-killall-pidfd_send_signal.patch40
1 files changed, 40 insertions, 0 deletions
diff --git a/sys-process/psmisc/files/psmisc-23.5-fix-killall-pidfd_send_signal.patch b/sys-process/psmisc/files/psmisc-23.5-fix-killall-pidfd_send_signal.patch
new file mode 100644
index 000000000000..0fc9c30a9635
--- /dev/null
+++ b/sys-process/psmisc/files/psmisc-23.5-fix-killall-pidfd_send_signal.patch
@@ -0,0 +1,40 @@
+https://gitlab.com/psmisc/psmisc/-/commit/6892e321e7042e3df60a5501a1c59d076e8a856f
+
+From 6892e321e7042e3df60a5501a1c59d076e8a856f Mon Sep 17 00:00:00 2001
+From: Craig Small <csmall@dropbear.xyz>
+Date: Mon, 18 Jul 2022 20:16:42 +1000
+Subject: [PATCH] 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
+--- 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);
+ }
+GitLab