ps: Match on truncated 16 char for -C

The referenced commit the comm length was increased from 16 to 64
characters to handle the larger command names for things like kernel
threads.

However most user processes are limited to 15 characters which means
if you try something like ps -C myprogramisbiggerthansixteen this would
fail to match because /proc/<PID>/comm would only be myprogramisbigg

ps now checks the comm length and if it is 15 and if the given match
is 15 or more, it will only match the first 15 characters.

This is also how killall has worked for about a year.

Thanks to Jean Delvare <jdelvare@suse.de> for the note.

Copy of commit from master.

References:
 commit 14005a371e
 commit psmisc/psmisc@1188315cd0
 commit 3e1c00d051

Signed-off-by: Craig Small <csmall@dropbear.xyz>
This commit is contained in:
Craig Small 2020-09-24 22:19:11 +10:00
parent da02101513
commit 955aaaf732
2 changed files with 11 additions and 2 deletions

1
NEWS
View File

@ -7,6 +7,7 @@ procps-ng NEXT
* pgrep: Add older than selection merge #79 * pgrep: Add older than selection merge #79
* pidof: show worker threads Redhat #1803640 * pidof: show worker threads Redhat #1803640
* ps.1: Mention stime alias issue #164 * ps.1: Mention stime alias issue #164
* ps: check also match on truncated 16 char comm names
* sysctl: Match systemd directory order * sysctl: Match systemd directory order
* sysctl: Document directory order Debian #951550 * sysctl: Document directory order Debian #951550
* top: ensure config file backward compatibility Debian #951335 * top: ensure config file backward compatibility Debian #951335

View File

@ -113,8 +113,16 @@ static int proc_was_listed(proc_t *buf){
break; case SEL_TTY : return_if_match(rSv(TTY, s_int, buf),tty); break; case SEL_TTY : return_if_match(rSv(TTY, s_int, buf),tty);
break; case SEL_SESS: return_if_match(rSv(ID_SESSION, s_int, buf),pid); break; case SEL_SESS: return_if_match(rSv(ID_SESSION, s_int, buf),pid);
break; case SEL_COMM: i=sn->n; while(i--) break;
case SEL_COMM:
i=sn->n;
while(i--) {
/* special case, comm is 16 characters but match is longer */
if (strlen(rSv(CMD, str, buf)) == 15 && strlen((*(sn->u+i)).cmd) >= 15)
if(!strncmp( rSv(CMD, str, buf), (*(sn->u+i)).cmd, 15 )) return 1;
if(!strncmp( rSv(CMD, str, buf), (*(sn->u+i)).cmd, 63 )) return 1; if(!strncmp( rSv(CMD, str, buf), (*(sn->u+i)).cmd, 63 )) return 1;
}
#undef return_if_match #undef return_if_match