pgrep: fix pgrep -flx "sleep 11" - saw "sleep 11" processes as "sleep 11 "
authorDenys Vlasenko <vda.linux@googlemail.com>
Mon, 26 Jun 2017 12:41:53 +0000 (14:41 +0200)
committerDenys Vlasenko <vda.linux@googlemail.com>
Mon, 26 Jun 2017 12:41:53 +0000 (14:41 +0200)
function                                             old     new   delta
pgrep_main                                           584     597     +13

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
procps/pgrep.c

index e932a32bc608619dcf07dfdc0a3cd7200b20f730..461abfa340a0ba2ca7923249b68e40c1b46ec24c 100644 (file)
@@ -156,22 +156,28 @@ int pgrep_main(int argc UNUSED_PARAM, char **argv)
                if (proc->pid == pid)
                        continue;
 
+               if (ppid2match >= 0 && ppid2match != proc->ppid)
+                       continue;
+               if (sid2match >= 0 && sid2match != proc->sid)
+                       continue;
+
                cmd = proc->argv0;
                if (!cmd) {
                        cmd = proc->comm;
                } else {
                        int i = proc->argv_len;
+                       /*
+                        * "sleep 11" looks like "sleep""\0""11""\0" in argv0.
+                        * Make sure last "\0" does not get converted to " ":
+                        */
+                       if (i && cmd[i-1] == '\0')
+                               i--;
                        while (--i >= 0) {
                                if ((unsigned char)cmd[i] < ' ')
                                        cmd[i] = ' ';
                        }
                }
 
-               if (ppid2match >= 0 && ppid2match != proc->ppid)
-                       continue;
-               if (sid2match >= 0 && sid2match != proc->sid)
-                       continue;
-
                /* NB: OPT_INVERT is always 0 or 1 */
                if (!argv[0]
                 || (regexec(&re_buffer, cmd, 1, re_match, 0) == 0 /* match found */