From cb297af8487daae6a6f552d17b13d29912882584 Mon Sep 17 00:00:00 2001 From: Hisham Muhammad Date: Wed, 9 Apr 2014 17:43:54 -0300 Subject: [PATCH] Fix invalid access when highlighting basename of threads. --- Process.c | 8 ++++---- ProcessList.c | 5 ++++- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/Process.c b/Process.c index 04804810..97f2fff2 100644 --- a/Process.c +++ b/Process.c @@ -405,14 +405,13 @@ static inline void Process_writeCommand(Process* this, int attr, int baseattr, R RichString_append(str, attr, this->comm); if (this->pl->highlightBaseName) { int finish = RichString_size(str) - 1; - int space = start + this->basenameOffset; - if (space != -1) - finish = space - 1; + if (this->basenameOffset != -1) + finish = (start + this->basenameOffset) - 1; int colon = RichString_findChar(str, ':', start); if (colon != -1 && colon < finish) { finish = colon; } else { - for (int i = finish - start; i > 0; i--) { + for (int i = finish - start; i >= 0; i--) { if (this->comm[i] == '/') { start += i+1; break; @@ -648,6 +647,7 @@ Process* Process_new(struct ProcessList_ *pl) { this->utime = 0; this->stime = 0; this->comm = NULL; + this->basenameOffset = -1; this->indent = 0; #ifdef HAVE_CGROUP this->cgroup = NULL; diff --git a/ProcessList.c b/ProcessList.c index 850715e8..813b9775 100644 --- a/ProcessList.c +++ b/ProcessList.c @@ -708,10 +708,10 @@ static bool ProcessList_readCmdlineFile(Process* process, const char* dirname, c if (tokenEnd == 0) { tokenEnd = amtRead; } - process->basenameOffset = tokenEnd; command[amtRead] = '\0'; free(process->comm); process->comm = strdup(command); + process->basenameOffset = tokenEnd; return true; } @@ -831,10 +831,12 @@ static bool ProcessList_processEntries(ProcessList* this, const char* dirname, P if (process->state == 'Z') { free(process->comm); + process->basenameOffset = -1; process->comm = strdup(command); } else if (Process_isThread(process)) { if (this->showThreadNames || Process_isKernelThread(process) || process->state == 'Z') { free(process->comm); + process->basenameOffset = -1; process->comm = strdup(command); } else if (this->showingThreadNames) { if (! ProcessList_readCmdlineFile(process, dirname, name)) @@ -858,6 +860,7 @@ static bool ProcessList_processEntries(ProcessList* this, const char* dirname, P errorReadingProcess: { if (process->comm) { free(process->comm); + process->basenameOffset = -1; process->comm = NULL; } if (existingProcess)