[git commit] pgrep/pkill: fix -x to also match comm field

Denys Vlasenko vda.linux at googlemail.com
Sat Nov 8 06:42:34 UTC 2025


commit: https://git.busybox.net/busybox/commit/?id=4ee218a2d262943e362e3e25414852cf8e982dcb
branch: https://git.busybox.net/busybox/commit/?id=refs/heads/master

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 at gmail.com>
Signed-off-by: Denys Vlasenko <vda.linux at googlemail.com>
---
 procps/pgrep.c | 8 ++++----
 1 file 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 */


More information about the busybox-cvs mailing list