summaryrefslogtreecommitdiff
path: root/procps/pgrep.c
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2025-10-23 12:39:47 +0200
committerDenys Vlasenko <vda.linux@googlemail.com>2025-11-08 07:42:34 +0100
commit4ee218a2d262943e362e3e25414852cf8e982dcb (patch)
treebfc6e7b895f70595f7d40457018a9759334447d7 /procps/pgrep.c
parentd549c8be8636dd523358565e573eeba4fc1f928d (diff)
pgrep/pkill: fix -x to also match comm field
When running `pgrep -x example` against a process `/bin/example --arg`, BusyBox fails to match, while GNU pgrep succeeds. The reason is that the comparison is done only against the full argv[0] rather than comm. This patch changes pgrep -x to also try /proc/[pid]/comm for exact matching. function old new delta pgrep_main 681 670 -11 Signed-off-by: Paulius Zaleckas <paulius.zaleckas@gmail.com> Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Diffstat (limited to 'procps/pgrep.c')
-rw-r--r--procps/pgrep.c8
1 files changed, 4 insertions, 4 deletions
diff --git a/procps/pgrep.c b/procps/pgrep.c
index 04ae92a67..299e2dac7 100644
--- a/procps/pgrep.c
+++ b/procps/pgrep.c
@@ -215,16 +215,16 @@ int pgrep_main(int argc UNUSED_PARAM, char **argv)
if (!match) {
again:
match = (regexec(&re_buffer, cmd, 1, re_match, 0) == 0);
+ if (match && OPT_ANCHOR) {
+ /* -x requires full string match */
+ match = (re_match[0].rm_so == 0 && cmd[re_match[0].rm_eo] == '\0');
+ }
if (!match && cmd != proc->comm) {
/* if argv[] did not match, try comm */
cmdlen = -1;
cmd = proc->comm;
goto again;
}
- if (match && OPT_ANCHOR) {
- /* -x requires full string match */
- match = (re_match[0].rm_so == 0 && cmd[re_match[0].rm_eo] == '\0');
- }
}
/* NB: OPT_INVERT is always 0 or 1 */