Skip to content

Commit

Permalink
Avoid UB for deep nested processes
Browse files Browse the repository at this point in the history
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)
  • Loading branch information
cgzones authored and BenBE committed Aug 4, 2022
1 parent 584b487 commit 9631bc9
Show file tree
Hide file tree
Showing 3 changed files with 5 additions and 5 deletions.
4 changes: 2 additions & 2 deletions Process.c
Original file line number Diff line number Diff line change
Expand Up @@ -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, " ");
Expand Down
2 changes: 1 addition & 1 deletion Process.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 */
Expand Down
4 changes: 2 additions & 2 deletions ProcessList.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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;
Expand Down

0 comments on commit 9631bc9

Please sign in to comment.