The last time library 'escape' logic was refactored in
the patch referenced below potential problems remained
which have now surfaced. They involve those C1 control
characters especially device control strings (DCS/ST).
Such strings, if not handled by the terminal emulator,
could lead to abnormal behaviors or even some exploit.
So, this commit will now escape the multi-byte control
characters (U+0080 thru U+009f). All single byte ascii
control characters were already treated in this manner.
[ in addition, continuation bytes in utf-8 encodings ]
[ requiring two bytes or more will also be validated ]
And unlike the current code, which will escape all the
remaining non-ascii bytes when some error is detected,
this patch honors remaining valid ascii & utf-8 bytes.
Reference(s):
. Dec, 2020 - 'escape' logic' was refactored *again)
commit 649e45482f
Signed-off-by: Jim Warner <james.warner@comcast.net>
This patch was prompted by the issue referenced below.
It also places the top man page on a par with the free
man page which does a good job of documenting sources.
Reference(s):
https://gitlab.com/procps-ng/procps/-/issues/292
Signed-off-by: Jim Warner <james.warner@comcast.net>
When 'r' in vmstat displays the number of processed,
delete the vmstat process, which is the same ad the
version before refactoring.
Signed-off-by: zhoujie <zhoujie133@huawei.com>
Guest time was removed from User time but not printed. This meant
that if guest time was non-zero then the CPU numbers did not add
up to 100%
References:
!191!113
commit 2461bb5bc1
Signed-off-by: Craig Small <csmall@dropbear.xyz>
Call trace:
#0 __vsnprintf_internal
#1 0x00007f967aedd656 in __GI___snprintf
#2 0x00005612da28c707 in snprintf
#3 config_read (rc_filename=<optimized out>) at pmap.c:885
#4 0x00005612da28b8c0 int main at pmap.c:1144
The above stack is caused by calling a null pointer
after the memory allocation fails. Increase the null
pointer judgment.
signed-off-by: zhoujie <zhoujie133@huawei.com>
The xstrdup function calls strdup internally,
and strdup will apply for memory internally
and needs to be released externally. The
function calls xstrdup(name) twice, but only
releases the memory requested by the second
call. The first call of xstrdup(name) is
meaningless, so it is recommended to delete it.
signed-off-by: zhoujie <zhoujie133@huawei.com>
pgrep gives a warning if the match string is longer than
15 characters and there was no match. That often does not
make sense when using regex or at the very least difficult
to know when to warn users. e.g
"1234567890|123456789X" is a 21 character string but only
matching two 10 string words.
pgrep has a simple check for regex and will now suppress
that warning if that has been used.
References:
https://bugs.debian.org/1037450
Signed-off-by: Craig Small <csmall@dropbear.xyz>
The issue cited below revealed an earlier commit, also
shown below, resulted in an incorrect tics value for a
thread group leader. That change was made so the group
leader would have a proper autogroup id, not a -1 that
was shown with sibling threads which lacked that file.
So this patch will just restore pre version 4 behavior
while not upsetting LIBPROC_HIDE_KERNEL functionality.
[ this change means that when THREAD mode is active, ]
[ the autogroup id & nice values won't be available. ]
[ they were only shown for the group leaders anyway. ]
Reference(s):
https://gitlab.com/procps-ng/procps/-/issues/280
. Aug, 2021 - thread group leader change
commit a375262609
Signed-off-by: Jim Warner <james.warner@comcast.net>
sd_get_sessions() will not return ENOENT as error, as this only means
that there is no session, not that systemd is not used. Use the
recommended sd_booted() function for this.
Signed-off-by: Thorsten Kukuk <kukuk@suse.com>
Signed-off-by: Craig Small <csmall@dropbear.xyz>
A test to check that the ps -lm bug doesn't come back.
References:
commit 93b7f05e54
commit 35dc38cb7f
Signed-off-by: Craig Small <csmall@dropbear.xyz>
Well as luck would have it I found yet another missing
field (SCHED_CLASS) that's needed by that '-m' option.
And, while it could just be added to the previous test
of thread_flags and TF_U_m, here is a much better fix.
[ The problem lies with the lists_and_needs function ]
[ where a new format list was created and some print ]
[ functions changed to pr_nop which displays a dash! ]
[ So, by calling the finalize_stacks function before ]
[ calling lists_and_needs, the former will see those ]
[ format nodes before any print function is changed. ]
Reference(s):
May, 2023 - missing fields with -m option
commit 35dc38cb7f
Signed-off-by: Jim Warner <james.warner@comcast.net>
Coincidentally, a Debian bug report and a gitlab issue
were raised at nearly the same time and are referenced
below. They both dealt with that '-m' (thread) option.
That option forces tasks and their threads to be shown
on separate lines. Also, information may be suppressed
between that main process and any lightweight process.
The bottom line was sometimes a required pids_item may
not have been requested from the library before trying
to display a result. For the best case, some incorrect
results might be shown. However, in the worst case (as
with PIDS_WCHAN_NAME) a segmentation fault is created.
[ After addressing the '-m' option problems, another ]
[ issue was found with that '-F' (extra full format) ]
[ option. The PSR (processor) field was always zero. ]
[ It was addressed in a similar manner to the above. ]
Reference(s):
https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1036631https://gitlab.com/procps-ng/procps/-/issues/279
Signed-off-by: Jim Warner <james.warner@comcast.net>
terminfo is notoriously unreliable when it comes to the
erase character. Use the terminal setting instead. Also
hardcode both commonly used characters just to be safe.
Do not assign unwanted actions to '\0'.
Reference(s):
https://gitlab.com/procps-ng/procps/-/issues/278
While musl has utmpx.h, their header file does not define all the
values, especially __UT_HOSTSIZE and friends. Instead it just
hard codes the sizes :/
This change will look for that definition specifically and if
not found will include utmp.h too. Checked on Alpine 3.17
musl just makes these a stub so w doesn't work anyway.
Signed-off-by: Craig Small <csmall@dropbear.xyz>
When the cpu utilization is displayed for
the first time, the reading of the /proc/stat
file is very close to each other, resulting
in large fluctuations. The version before
refactoring, such as v3.3.17, has a delay
before reading the /proc/stat file for the
second time, and the same delay is added here.
signed-off-by: zhoujie <zhoujie133@huawei.com>
signed-off-by: he jingxian <hejingxian@huawei.com>
Signed-off-by: Jim Warner <james.warner@comcast.net>
This program employs fixed size stacks which currently
total 85 result structures. When a field was not being
shown, those unused result structures were initialized
as 'PIDS_extra' items. As a result, that library would
then reset the results to zero with every interaction.
For any of those result structs holding values created
by top this was appropriate. But for most, it was not.
So this patch will reduce that use of PIDS_extra while
vastly increasing use of the less expensive PIDS_noop.
Signed-off-by: Jim Warner <james.warner@comcast.net>
Currently, all the newlib APIs handle the assigning of
results the same. Namely, they loop through the stacks
while checking for the hidden 'logical_end' fencepost.
Along the way, the Item_table was indexed to determine
which 'setsfunc' to call, passing suitable parameters.
The approach was quite robust since by testing against
the unsigned 'logical_end' enumerator this library was
immune from user result corruption. The worst that may
happen was early loop exit with some results unvalued.
However, there was a drawback to the current approach.
For every result structure in every stack, an index to
that Item_table had to be calculated for a 'setsfunc'.
For programs like top or ps that may involve thousands
of Item_table index recalculations for each iteration.
With this commit, in support of assign, we will now do
the needed Item_table calculations just one time under
the 'new' and 'reset' functions. Then, at assign time,
the only overhead is actually invoking the 'setsfunc'.
This makes us even more robust than we were before. No
longer will a corrupted results structure suffer early
assign exit leaving some unvalued. Rather, all results
are properly placed regardless of any user corruption.
[ those other interfaces will remain unchanged since ]
[ the depth of their stacks are modest and since the ]
[ assign guys weren't already passed an info pointer ]
Signed-off-by: Jim Warner <james.warner@comcast.net>
Ever since this pids api was first introduced in 2015,
there existed both the 'curitems' plus 'maxitems' used
internally. While the reasoning behind such duality is
lost to time, it probably related to top's capacity to
grow/shrink stack size depending on what is displayed.
While top no longer employs a dynamically sized stack,
with the current library logic it makes no difference.
For sometime now the pids guy handles either approach.
So, this commit converts all references to 'maxitems'.
Signed-off-by: Jim Warner <james.warner@comcast.net>
Added the -L --line option to free to show a small
set of memory statistics on a single line of 80 characters.
Largely based on the work of @Ulenrich1 and updated to
the new API.
References:
procps-ng/procps#156
Signed-off-by: Craig Small <csmall@dropbear.xyz>
One of our physical machine shows that the "CACHE SIZE" column
of slabtop output is extremely high, three times of the products
of objs nums and objs size. After some analysis, we found that
the order of slab, which decides "pages per slab", will shrink
when memory pressure is high and normal order allocation failed.
So we think it might help to add these comments to the man help.
Minor fix: add the "memory." back, which is lost after
"aa461df0: docs: Minor manpage fixes"
Signed-off-by: Zhao Mengmeng <zhaomengmeng@kylinos.cn>
The 'guest' tics are added in the
sum_tics function, but when multiple
cpus are combined for display, the
'guest' tics are not added cumulatively
in the sum_unify function.
signed-off-by: zhoujie <zhoujie133@huawei.com>
The utmp format of glibc is not Y2038 safe, not even on 64bit systems.
Query logind/elogind for the number of users if we use libsystemd.
Signed-off-by: Thorsten Kukuk <kukuk@suse.com>
Well this is embarrassing. After repeatedly flogging a
horse (represented by issue #274) I was certain it was
dead. But, it turns out that the darn thing yet lived.
In fact, the bug that was patched was not even the one
the poster experienced. Now merge request #173 finally
penetrated my foggy brain and explicated the real bug.
Since forever (linux 2.6), top has ignored those guest
and guest_nice fields in /proc/stat. When many virtual
machines were running that overhead went unrecognized.
So, this commit simply adds those tics to the 'system'
figures so that it can be seen in text or graph modes.
Reference(s):
https://gitlab.com/procps-ng/procps/-/merge_requests/173https://gitlab.com/procps-ng/procps/-/issues/274
. Mar 2023, avoid keystroke '%Cpu' distortions
commit 7e33fc47c6
Signed-off-by: Jim Warner <james.warner@comcast.net>
Please do not look at this change and especially don't
look at that commit message for the patch shown below.
[ that way you won't notice I misinterpreted 'H' for ]
[ an 'h' when this logic was reversed as 'redundant' ]
Reference(s):
commit 7e33fc47c6
Signed-off-by: Jim Warner <james.warner@comcast.net>
Like a line from the movie Cool Hand Luke: "what we've
got here is failure to communicate"; well that was me!
Finally, I got a handle on the issue referenced below.
At first, it seemed inappropriate to try comparing cpu
percentages as reported by different top versions. And
even more so when they are invoked many seconds apart.
As it turns out, this issue had nothing to do with the
specific processor. Nor did it involve two versions of
top running simultaneously using the same delay value.
Rather, it concerns keyboard input and several changes
which were made last year in commits referenced below.
They were prompted by development of the 'Ctrl' bottom
window feature. Initially, if transitioning from a big
window to a small window portions of the former window
remained visible until the next refresh. A solution to
that led to a flaw when resizing top. Fixing that then
created a race condition with full screen replacement.
The net effect of all those changes was to distort the
cpu percentage value for the processor on which top is
dispatched to service user input. It arose because the
new frame was begun immediately, yielding few 'ticks'.
[ when fewer ticks are accumulated the potential for ]
[ distortion increases. As an example, hold some key ]
[ then watch cpu percentages (works best in graphs). ]
[ while any version of top will show distortions for ]
[ the above experiment, a v4.0.0 top will be greater ]
[ and %cpu is distorted even for a single keystroke. ]
So, to restore proper 3.3.17 keystroke behavior, we'll
revert parts of the first 3 commits shown below. Plus,
the 4th commit will be entirely reversed as redundant.
Reference(s):
https://gitlab.com/procps-ng/procps/-/issues/274
. Sep, 2022 - avoid potential 'BREAK_screen' race
commit 3e5016c289
. Sep, 2022 - fix improper sigwinch behavior
commit 9d9993708b
. May, 2022 - made more responsive to kdb input
commit 3ea1bc779f
. turn bottom window off with additional key
commit 3f068a66c8
Signed-off-by: Jim Warner <james.warner@comcast.net>
When getopt usage was added (plus long options) in the
patch shown below, top no longer returned EXIT_FAILURE
when the error message was generated by getopt itself.
This commit will restore the proper behavior no matter
who might issue a command line argument error message.
Thanks to Bastian Bittorf for discovering this buglet.
Reference(s):
https://gitlab.com/procps-ng/procps/-/issues/273
. sep, 2021 - getopt with long form args
commit c91b371485
Signed-off-by: Jim Warner <james.warner@comcast.net>
strncpy does not null terminate a string if it has the maximal length.
Use always the null terminated variants for ut_user and ut_line.
Signed-off-by: Thorsten Kukuk <kukuk@suse.com>
In the issue referenced below, it is now apparent that
not all architectures follow a logical/expected format
for the /proc/cpuinfo file. Specifically, the expected
empty line after each processor entry might be missing
under some architectures for the last processor shown.
[ and a belated review of kernel source confirms it. ]
So this commit makes our stat module a little bit more
tolerant of some potential missing newline characters.
[ along the way, it's also now tolerant of a missing ]
[ cpuinfo file plus more efficient whenever a cpu is ]
[ is not linked to a core or toggled offline/online. ]
Reference(s):
https://gitlab.com/procps-ng/procps/-/issues/272procps-ng/procps#272
Signed-off-by: Jim Warner <james.warner@comcast.net>
When pgrep was used to match on signal, it makes sense to use
the same signal parsing code as pkill. Unfortunately the
"find the signal" part is a little too enthusaistic about what a
signal is, meaning
pgrep -u -42
fails because the signal becomes "42" and then there is no UID.
This is a bit sad for pkill but has been that way for a long
time. For pgrep this is new so now only the long form
pgrep --signal <X>
will work.
In addition, when using --signal if pgrep/pkill couldn't work
out what the signal was it just silently ignored it. It now
complains and aborts.
References:
https://bugs.debian.org/1031765
commit 866abacf88
E.g. on my system I see this output to "free -vh", which fails the test:
total used free shared buff/cache available
Mem: 23Gi 17Gi 311Mi 2.2Gi 8.1Gi 5.8Gi
Swap: 2.0Gi 1.9Gi 105Mi
Comm: 13Gi 44Gi -31Gi
This commit just tweaks some recent copyright changes.
Foe example, the six public header files are unique to
this new library and thus are just attributed to Craig
and me. Plus, there were some misnamed file references
as '.c' for '.h' or 'libprocps' instead of 'libproc2'.
Signed-off-by: Jim Warner <james.warner@comcast.net>
This patch just follows Craig's lead for the remaining
ps and top program files and associated man documents.
Signed-off-by: Jim Warner <james.warner@comcast.net>
The copyrights of the source files were all out of date and were not
the same format. This has been corrected. The source of the authors
was examining the git log for each file.
Signed-off-by: Craig Small <csmall@dropbear.xyz>