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:
Jim Warner
2021-08-07 00:00:00 -05:00
committed by Craig Small
parent a375262609
commit af34cc964a
3 changed files with 26 additions and 7 deletions

View File

@@ -1214,11 +1214,27 @@ PROCPS_EXPORT int procps_pids_new (
, __FILE__, PIDS_SELECT_PID, PROC_PID);
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) {
fprintf(stderr, "%s: header error: PIDS_SELECT_UID = 0x%04x, PROC_UID = 0x%04x\n"
, __FILE__, PIDS_SELECT_UID, PROC_UID);
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);
#endif
@@ -1533,7 +1549,8 @@ PROCPS_EXPORT struct pids_fetch *procps_pids_select (
return NULL;
if (numthese < 1 || numthese > FILL_ID_MAX)
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;
/* with items & numitems technically optional at 'new' time, it's
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))
return NULL;
info->read_something = readproc;
info->read_something = (which & PIDS_FETCH_THREADS_TOO) ? readeither : readproc;
rc = pids_stacks_fetch(info);