123 lines
4.3 KiB
Diff
123 lines
4.3 KiB
Diff
|
From 1188315cd037d73bf946a0003b70c6423cc330d2 Mon Sep 17 00:00:00 2001
|
||
|
From: Craig Small <csmall@enc.com.au>
|
||
|
Date: Wed, 7 Nov 2018 20:13:09 +1100
|
||
|
Subject: [PATCH 01/11] killall: match on 16 character commlen too
|
||
|
|
||
|
The comm length increase meant killall could accomodate the
|
||
|
larger comm name given out by newer kernels but it meant that
|
||
|
if a user relied on the previous 16 character truncation then
|
||
|
processes that used to match would fail.
|
||
|
|
||
|
killall now checks to see if the the comm is the old COMM_LEN
|
||
|
length and the given name is longer than old COMM_LEN and does
|
||
|
a truncated match as well.
|
||
|
|
||
|
References:
|
||
|
https://bugs.debian.org/912748
|
||
|
---
|
||
|
ChangeLog | 3 +++
|
||
|
src/killall.c | 69 +++++++++++++++++++++++++++++++++++----------------
|
||
|
2 files changed, 50 insertions(+), 22 deletions(-)
|
||
|
|
||
|
diff --git a/ChangeLog b/ChangeLog
|
||
|
index 7fd2abd..37962cb 100644
|
||
|
--- a/ChangeLog
|
||
|
+++ b/ChangeLog
|
||
|
@@ -1,3 +1,6 @@
|
||
|
+Changes in 23.4
|
||
|
+===============
|
||
|
+ * killall: check also truncated 16 char comm names Debian #912748
|
||
|
Changes in 23.2
|
||
|
===============
|
||
|
* misc: Command names increased from 16 to 64 characters
|
||
|
diff --git a/src/killall.c b/src/killall.c
|
||
|
index 2715515..09212a4 100644
|
||
|
--- a/src/killall.c
|
||
|
+++ b/src/killall.c
|
||
|
@@ -492,6 +492,49 @@ create_pid_table(int *max_pids, int *pids)
|
||
|
return pid_table;
|
||
|
}
|
||
|
|
||
|
+#define strcmp2(A,B,I) (I? strcasecmp((A),(B)):strcmp((A),(B)))
|
||
|
+#define strncmp2(A,B,L,I) (I? strncasecmp((A),(B),(L)):strncmp((A),(B),(L)))
|
||
|
+static int match_process_name(
|
||
|
+ const char *proc_comm,
|
||
|
+ const int comm_len,
|
||
|
+ const char *proc_cmdline,
|
||
|
+ const char *match_name,
|
||
|
+ const int match_len,
|
||
|
+ const int got_long
|
||
|
+ )
|
||
|
+{
|
||
|
+ /* process is old length but matching longer */
|
||
|
+ if (comm_len == OLD_COMM_LEN - 1 && match_len >= OLD_COMM_LEN - 1)
|
||
|
+ {
|
||
|
+ if (got_long)
|
||
|
+ {
|
||
|
+ return (0 == strncmp2 (match_name, proc_cmdline, OLD_COMM_LEN - 1,
|
||
|
+ ignore_case));
|
||
|
+ } else {
|
||
|
+ return (0 == strncmp2 (match_name, proc_comm, OLD_COMM_LEN - 1,
|
||
|
+ ignore_case));
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ if (comm_len == COMM_LEN - 1 && match_len >= COMM_LEN - 1)
|
||
|
+ {
|
||
|
+ if (got_long)
|
||
|
+ {
|
||
|
+ return (0 == strncmp2 (match_name, proc_cmdline, COMM_LEN - 1,
|
||
|
+ ignore_case));
|
||
|
+ } else {
|
||
|
+ return (0 == strncmp2 (match_name, proc_comm, COMM_LEN - 1,
|
||
|
+ ignore_case));
|
||
|
+ }
|
||
|
+ }
|
||
|
+ /* Not old new COMM_LEN so we match all of it */
|
||
|
+ if (got_long)
|
||
|
+ {
|
||
|
+ return (0 == strcmp2 (match_name, proc_cmdline, ignore_case));
|
||
|
+ }
|
||
|
+ return (0 == strcmp2 (match_name, proc_comm, ignore_case));
|
||
|
+}
|
||
|
+
|
||
|
#ifdef WITH_SELINUX
|
||
|
static int
|
||
|
kill_all(int signal, int name_count, char **namelist, struct passwd *pwent,
|
||
|
@@ -599,28 +642,10 @@ kill_all (int signal, int name_count, char **namelist, struct passwd *pwent)
|
||
|
{
|
||
|
if (!name_info[j].st.st_dev)
|
||
|
{
|
||
|
- if (length != COMM_LEN - 1 || name_info[j].name_length < COMM_LEN - 1)
|
||
|
- {
|
||
|
- if (ignore_case == 1)
|
||
|
- {
|
||
|
- if (strcasecmp (namelist[j], comm))
|
||
|
- continue;
|
||
|
- } else {
|
||
|
- if (strcmp(namelist[j], comm))
|
||
|
- continue;
|
||
|
- }
|
||
|
- } else {
|
||
|
- if (ignore_case == 1)
|
||
|
- {
|
||
|
- if (got_long ? strcasecmp (namelist[j], command) :
|
||
|
- strncasecmp (namelist[j], comm, COMM_LEN - 1))
|
||
|
- continue;
|
||
|
- } else {
|
||
|
- if (got_long ? strcmp (namelist[j], command) :
|
||
|
- strncmp (namelist[j], comm, COMM_LEN - 1))
|
||
|
- continue;
|
||
|
- }
|
||
|
- }
|
||
|
+ if (!match_process_name(comm, length, command, namelist[j],
|
||
|
+ name_info[j].name_length, got_long))
|
||
|
+ continue;
|
||
|
+
|
||
|
} else {
|
||
|
int ok = 1;
|
||
|
if (asprintf (&path, PROC_BASE "/%d/exe", pid_table[i]) < 0)
|
||
|
--
|
||
|
2.20.1
|
||
|
|