summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristian Göttsche <cgzones@googlemail.com>2022-06-21 21:10:47 +0200
committerBenBE <BenBE@geshi.org>2022-08-04 19:49:52 +0200
commit9631bc98a95d5144a149b6b9dfcbe077449fea22 (patch)
treebb941cdca94216f04a78c95a0124bfa82d65fea8
parent584b487306b9219f3767275ba60d0480445871a5 (diff)
Avoid UB for deep nested processes
Also increase the limit for nesting by using 64 bit integers. ProcessList.c:242:36: runtime error: left shift of 1 by 31 places cannot be represented in type 'int' #0 0x561cfec000a8 in ProcessList_buildTreeBranch ProcessList.c:242:36 #1 0x561cfebffec2 in ProcessList_buildTreeBranch ProcessList.c:243:7 #2 0x561cfebffec2 in ProcessList_buildTreeBranch ProcessList.c:243:7 #3 0x561cfebffec2 in ProcessList_buildTreeBranch ProcessList.c:243:7 #4 0x561cfebffec2 in ProcessList_buildTreeBranch ProcessList.c:243:7 #5 0x561cfebffec2 in ProcessList_buildTreeBranch ProcessList.c:243:7 #6 0x561cfebffec2 in ProcessList_buildTreeBranch ProcessList.c:243:7 #7 0x561cfebffec2 in ProcessList_buildTreeBranch ProcessList.c:243:7 #8 0x561cfebffec2 in ProcessList_buildTreeBranch ProcessList.c:243:7 #9 0x561cfebffec2 in ProcessList_buildTreeBranch ProcessList.c:243:7 #10 0x561cfebffec2 in ProcessList_buildTreeBranch ProcessList.c:243:7 #11 0x561cfebffec2 in ProcessList_buildTreeBranch ProcessList.c:243:7 #12 0x561cfebffec2 in ProcessList_buildTreeBranch ProcessList.c:243:7 #13 0x561cfebffec2 in ProcessList_buildTreeBranch ProcessList.c:243:7 #14 0x561cfebffec2 in ProcessList_buildTreeBranch ProcessList.c:243:7 #15 0x561cfebffec2 in ProcessList_buildTreeBranch ProcessList.c:243:7 #16 0x561cfebffec2 in ProcessList_buildTreeBranch ProcessList.c:243:7 #17 0x561cfebffec2 in ProcessList_buildTreeBranch ProcessList.c:243:7 #18 0x561cfebffec2 in ProcessList_buildTreeBranch ProcessList.c:243:7 #19 0x561cfebffec2 in ProcessList_buildTreeBranch ProcessList.c:243:7 #20 0x561cfebffec2 in ProcessList_buildTreeBranch ProcessList.c:243:7 #21 0x561cfebffec2 in ProcessList_buildTreeBranch ProcessList.c:243:7 #22 0x561cfebffec2 in ProcessList_buildTreeBranch ProcessList.c:243:7 #23 0x561cfebffec2 in ProcessList_buildTreeBranch ProcessList.c:243:7 #24 0x561cfebffec2 in ProcessList_buildTreeBranch ProcessList.c:243:7 #25 0x561cfebffec2 in ProcessList_buildTreeBranch ProcessList.c:243:7 #26 0x561cfebffec2 in ProcessList_buildTreeBranch ProcessList.c:243:7 #27 0x561cfebffec2 in ProcessList_buildTreeBranch ProcessList.c:243:7 #28 0x561cfebffec2 in ProcessList_buildTreeBranch ProcessList.c:243:7 #29 0x561cfebffec2 in ProcessList_buildTreeBranch ProcessList.c:243:7 #30 0x561cfebffec2 in ProcessList_buildTreeBranch ProcessList.c:243:7 #31 0x561cfebffec2 in ProcessList_buildTreeBranch ProcessList.c:243:7 #32 0x561cfebfb734 in ProcessList_buildTree ProcessList.c:312:10 #33 0x561cfebfb050 in ProcessList_updateDisplayList ProcessList.c:326:10 #34 0x561cfebfc58b in ProcessList_rebuildPanel ProcessList.c:374:4 #35 0x561cfec07953 in checkRecalculation ScreenManager.c:139:7 #36 0x561cfec07953 in ScreenManager_run ScreenManager.c:226:10 #37 0x561cfeb8899a in CommandLine_run CommandLine.c:378:4 #38 0x561cfeb6d6d4 in main htop.c:15:11 #39 0x7f14860291e9 in __libc_start_call_main csu/../sysdeps/nptl/libc_start_call_main.h:58:16 #40 0x7f148602929b in __libc_start_main csu/../csu/libc-start.c:392:3 #41 0x561cfeaafb20 in _start (htop+0x105b20) (BuildId: fc4b9e52ffc111ca8b4cd53136a238414120a858)
-rw-r--r--Process.c4
-rw-r--r--Process.h2
-rw-r--r--ProcessList.c4
3 files changed, 5 insertions, 5 deletions
diff --git a/Process.c b/Process.c
index 465c16af..218845b1 100644
--- a/Process.c
+++ b/Process.c
@@ -784,9 +784,9 @@ void Process_writeField(const Process* this, RichString* str, ProcessField field
char* buf = buffer;
const bool lastItem = (this->indent < 0);
- for (int indent = (this->indent < 0 ? -this->indent : this->indent); indent > 1; indent >>= 1) {
+ for (uint32_t indent = (this->indent < 0 ? -this->indent : this->indent); indent > 1; indent >>= 1) {
int written, ret;
- if (indent & 1) {
+ if (indent & 1U) {
ret = xSnprintf(buf, n, "%s ", CRT_treeStr[TREE_STR_VERT]);
} else {
ret = xSnprintf(buf, n, " ");
diff --git a/Process.h b/Process.h
index a1ca50fb..d7127ff0 100644
--- a/Process.h
+++ b/Process.h
@@ -242,7 +242,7 @@ typedef struct Process_ {
/*
* Internal state for tree-mode.
*/
- int indent;
+ int32_t indent;
unsigned int tree_depth;
/* Has no known parent process */
diff --git a/ProcessList.c b/ProcessList.c
index bbaddd86..d1156789 100644
--- a/ProcessList.c
+++ b/ProcessList.c
@@ -199,7 +199,7 @@ static void ProcessList_removeIndex(ProcessList* this, const Process* p, int idx
assert(Vector_countEquals(this->processes, Hashtable_count(this->processTable)));
}
-static void ProcessList_buildTreeBranch(ProcessList* this, pid_t pid, int level, int indent, bool show) {
+static void ProcessList_buildTreeBranch(ProcessList* this, pid_t pid, unsigned int level, int32_t indent, bool show) {
// On OpenBSD the kernel thread 'swapper' has pid 0.
// Do not treat it as root of any tree.
if (pid == 0)
@@ -239,7 +239,7 @@ static void ProcessList_buildTreeBranch(ProcessList* this, pid_t pid, int level,
Vector_add(this->displayList, process);
- int nextIndent = indent | (1 << level);
+ int32_t nextIndent = indent | ((int32_t)1 << MINIMUM(level, sizeof(process->indent) * 8 - 2));
ProcessList_buildTreeBranch(this, process->pid, level + 1, (i < lastShown) ? nextIndent : indent, process->show && process->showChildren);
if (i == lastShown) {
process->indent = -nextIndent;

© 2014-2024 Faster IT GmbH | imprint | privacy policy