library: repair <pids> api boo-boo in the 'select' i/f
The patch referenced below corrected some flaws in the
procps_pids_select implementation. But, there remained
one flaw which this commit will now hopefully address.
Rather than assume callers wished to select only tasks
and not threads meant a command like 'top -H -p 10329'
works differently under newlib than release 3.3.17. It
fails to honor the '-H' (threads) switch under newlib.
So, to fix that oops, we'll allow that select function
to get threads or tasks depending on its 'which' parm.
Reference(s):
. Oct 2015, some flaws corrected
commit bc616b3615
Signed-off-by: Jim Warner <james.warner@comcast.net>
This commit is contained in:
parent
a375262609
commit
af34cc964a
21
proc/pids.c
21
proc/pids.c
@ -1214,11 +1214,27 @@ PROCPS_EXPORT int procps_pids_new (
|
|||||||
, __FILE__, PIDS_SELECT_PID, PROC_PID);
|
, __FILE__, PIDS_SELECT_PID, PROC_PID);
|
||||||
failed = 1;
|
failed = 1;
|
||||||
}
|
}
|
||||||
|
if (PIDS_SELECT_PID_THREADS != PIDS_SELECT_PID + 1) {
|
||||||
|
fprintf(stderr, "%s: header error: PIDS_SELECT_PID_THREADS = 0x%04x, should be 0x%04x\n"
|
||||||
|
, __FILE__, PIDS_SELECT_PID_THREADS, PIDS_SELECT_PID + 1);
|
||||||
|
failed = 1;
|
||||||
|
}
|
||||||
if (PIDS_SELECT_UID != PROC_UID) {
|
if (PIDS_SELECT_UID != PROC_UID) {
|
||||||
fprintf(stderr, "%s: header error: PIDS_SELECT_UID = 0x%04x, PROC_UID = 0x%04x\n"
|
fprintf(stderr, "%s: header error: PIDS_SELECT_UID = 0x%04x, PROC_UID = 0x%04x\n"
|
||||||
, __FILE__, PIDS_SELECT_UID, PROC_UID);
|
, __FILE__, PIDS_SELECT_UID, PROC_UID);
|
||||||
failed = 1;
|
failed = 1;
|
||||||
}
|
}
|
||||||
|
if (PIDS_SELECT_UID_THREADS != PIDS_SELECT_UID + 1) {
|
||||||
|
fprintf(stderr, "%s: header error: PIDS_SELECT_UID_THREADS = 0x%04x, should be 0x%04x\n"
|
||||||
|
, __FILE__, PIDS_SELECT_UID_THREADS, PIDS_SELECT_UID + 1);
|
||||||
|
failed = 1;
|
||||||
|
}
|
||||||
|
// our select() function & select enumerators assume the following ...
|
||||||
|
if (PIDS_FETCH_THREADS_TOO != 1) {
|
||||||
|
fprintf(stderr, "%s: header error: PIDS_FETCH_THREADS_TOO = %d, should be 1\n"
|
||||||
|
, __FILE__, PIDS_FETCH_THREADS_TOO);
|
||||||
|
failed = 1;
|
||||||
|
}
|
||||||
if (failed) _Exit(EXIT_FAILURE);
|
if (failed) _Exit(EXIT_FAILURE);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -1533,7 +1549,8 @@ PROCPS_EXPORT struct pids_fetch *procps_pids_select (
|
|||||||
return NULL;
|
return NULL;
|
||||||
if (numthese < 1 || numthese > FILL_ID_MAX)
|
if (numthese < 1 || numthese > FILL_ID_MAX)
|
||||||
return NULL;
|
return NULL;
|
||||||
if (which != PIDS_SELECT_PID && which != PIDS_SELECT_UID)
|
if ((which != PIDS_SELECT_PID && which != PIDS_SELECT_UID)
|
||||||
|
&& ((which != PIDS_SELECT_PID_THREADS && which != PIDS_SELECT_UID_THREADS)))
|
||||||
return NULL;
|
return NULL;
|
||||||
/* with items & numitems technically optional at 'new' time, it's
|
/* with items & numitems technically optional at 'new' time, it's
|
||||||
expected 'reset' will have been called -- but just in case ... */
|
expected 'reset' will have been called -- but just in case ... */
|
||||||
@ -1547,7 +1564,7 @@ PROCPS_EXPORT struct pids_fetch *procps_pids_select (
|
|||||||
|
|
||||||
if (!pids_oldproc_open(&info->fetch_PT, (info->oldflags | which), ids, numthese))
|
if (!pids_oldproc_open(&info->fetch_PT, (info->oldflags | which), ids, numthese))
|
||||||
return NULL;
|
return NULL;
|
||||||
info->read_something = readproc;
|
info->read_something = (which & PIDS_FETCH_THREADS_TOO) ? readeither : readproc;
|
||||||
|
|
||||||
rc = pids_stacks_fetch(info);
|
rc = pids_stacks_fetch(info);
|
||||||
|
|
||||||
|
@ -189,8 +189,10 @@ enum pids_fetch_type {
|
|||||||
};
|
};
|
||||||
|
|
||||||
enum pids_select_type {
|
enum pids_select_type {
|
||||||
PIDS_SELECT_PID = 0x10000,
|
PIDS_SELECT_PID = 0x10000,
|
||||||
PIDS_SELECT_UID = 0x20000
|
PIDS_SELECT_PID_THREADS = 0x10001,
|
||||||
|
PIDS_SELECT_UID = 0x20000,
|
||||||
|
PIDS_SELECT_UID_THREADS = 0x20001
|
||||||
};
|
};
|
||||||
|
|
||||||
enum pids_sort_order {
|
enum pids_sort_order {
|
||||||
|
@ -1126,7 +1126,7 @@ static proc_t *simple_readproc(PROCTAB *restrict const PT, proc_t *restrict cons
|
|||||||
goto next_proc;
|
goto next_proc;
|
||||||
|
|
||||||
if ((flags & PROC_UID) && !XinLN(uid_t, sb.st_uid, PT->uids, PT->nuid))
|
if ((flags & PROC_UID) && !XinLN(uid_t, sb.st_uid, PT->uids, PT->nuid))
|
||||||
goto next_proc; /* not one of the requested uids */
|
goto next_proc; /* not one of the requested uids */
|
||||||
|
|
||||||
p->euid = sb.st_uid; /* need a way to get real uid */
|
p->euid = sb.st_uid; /* need a way to get real uid */
|
||||||
p->egid = sb.st_gid; /* need a way to get real gid */
|
p->egid = sb.st_gid; /* need a way to get real gid */
|
||||||
@ -1248,8 +1248,8 @@ static proc_t *simple_readtask(PROCTAB *restrict const PT, proc_t *restrict cons
|
|||||||
if (stat(path, &sb) == -1) /* no such dirent (anymore) */
|
if (stat(path, &sb) == -1) /* no such dirent (anymore) */
|
||||||
goto next_task;
|
goto next_task;
|
||||||
|
|
||||||
// if ((flags & PROC_UID) && !XinLN(uid_t, sb.st_uid, PT->uids, PT->nuid))
|
if ((flags & PROC_UID) && !XinLN(uid_t, sb.st_uid, PT->uids, PT->nuid))
|
||||||
// goto next_task; /* not one of the requested uids */
|
goto next_task; /* not one of the requested uids */
|
||||||
|
|
||||||
t->euid = sb.st_uid; /* need a way to get real uid */
|
t->euid = sb.st_uid; /* need a way to get real uid */
|
||||||
t->egid = sb.st_gid; /* need a way to get real gid */
|
t->egid = sb.st_gid; /* need a way to get real gid */
|
||||||
|
Loading…
Reference in New Issue
Block a user