w: Fix choice of current process

If there is a PID wrap-around w will choose the wrong process.
For example:
$ ps x -o pgrp,tpgid,start,tty,cmd | grep pts/3
 3834  3834 21:50:26 pts/3    ssh server
 4461  4461 21:57:14 pts/2    grep pts/3
23410  3834 21:07:17 pts/3    mutt
26071  3834   Jul 13 pts/3    /bin/bash

w will show the user as:
csmall   pts/3    my-laptop:S.1   13Jul15  5:54   1.36s  1.13s /bin/bash

So why?
w scans the process table and has two ways of finding the best match.
 #1 match things like terminal,username and process group, find oldest
 #2 match utmp pid to process tgid

The problem is that #2 trumped #1, which is fine when your login process
is numerically lower than your other processes. However in this case
26071 is larger and appears later in the readdir() than the correct
process, which is 3834.

The fix is not not overwrite best if it already exists.

Signed-off-by: Craig Small <csmall@enc.com.au>
This commit is contained in:
Craig Small 2015-07-21 22:25:06 +10:00
parent c07f6c5e6d
commit 857bb39d31

3
w.c
View File

@ -347,7 +347,8 @@ static const proc_t *getproc(const utmp_t * restrict const u,
const proc_t *restrict const tmp = *pptr;
if (unlikely(tmp->tgid == u->ut_pid)) {
*found_utpid = 1;
best = tmp;
if (!best)
best = tmp;
}
if (tmp->tty != line)
continue;