Fix invalid access when highlighting basename of threads.

This commit is contained in:
Hisham Muhammad 2014-04-09 17:43:54 -03:00
parent f2e4556b5e
commit cb297af848
2 changed files with 8 additions and 5 deletions

View File

@ -405,14 +405,13 @@ static inline void Process_writeCommand(Process* this, int attr, int baseattr, R
RichString_append(str, attr, this->comm); RichString_append(str, attr, this->comm);
if (this->pl->highlightBaseName) { if (this->pl->highlightBaseName) {
int finish = RichString_size(str) - 1; int finish = RichString_size(str) - 1;
int space = start + this->basenameOffset; if (this->basenameOffset != -1)
if (space != -1) finish = (start + this->basenameOffset) - 1;
finish = space - 1;
int colon = RichString_findChar(str, ':', start); int colon = RichString_findChar(str, ':', start);
if (colon != -1 && colon < finish) { if (colon != -1 && colon < finish) {
finish = colon; finish = colon;
} else { } else {
for (int i = finish - start; i > 0; i--) { for (int i = finish - start; i >= 0; i--) {
if (this->comm[i] == '/') { if (this->comm[i] == '/') {
start += i+1; start += i+1;
break; break;
@ -648,6 +647,7 @@ Process* Process_new(struct ProcessList_ *pl) {
this->utime = 0; this->utime = 0;
this->stime = 0; this->stime = 0;
this->comm = NULL; this->comm = NULL;
this->basenameOffset = -1;
this->indent = 0; this->indent = 0;
#ifdef HAVE_CGROUP #ifdef HAVE_CGROUP
this->cgroup = NULL; this->cgroup = NULL;

View File

@ -708,10 +708,10 @@ static bool ProcessList_readCmdlineFile(Process* process, const char* dirname, c
if (tokenEnd == 0) { if (tokenEnd == 0) {
tokenEnd = amtRead; tokenEnd = amtRead;
} }
process->basenameOffset = tokenEnd;
command[amtRead] = '\0'; command[amtRead] = '\0';
free(process->comm); free(process->comm);
process->comm = strdup(command); process->comm = strdup(command);
process->basenameOffset = tokenEnd;
return true; return true;
} }
@ -831,10 +831,12 @@ static bool ProcessList_processEntries(ProcessList* this, const char* dirname, P
if (process->state == 'Z') { if (process->state == 'Z') {
free(process->comm); free(process->comm);
process->basenameOffset = -1;
process->comm = strdup(command); process->comm = strdup(command);
} else if (Process_isThread(process)) { } else if (Process_isThread(process)) {
if (this->showThreadNames || Process_isKernelThread(process) || process->state == 'Z') { if (this->showThreadNames || Process_isKernelThread(process) || process->state == 'Z') {
free(process->comm); free(process->comm);
process->basenameOffset = -1;
process->comm = strdup(command); process->comm = strdup(command);
} else if (this->showingThreadNames) { } else if (this->showingThreadNames) {
if (! ProcessList_readCmdlineFile(process, dirname, name)) if (! ProcessList_readCmdlineFile(process, dirname, name))
@ -858,6 +860,7 @@ static bool ProcessList_processEntries(ProcessList* this, const char* dirname, P
errorReadingProcess: { errorReadingProcess: {
if (process->comm) { if (process->comm) {
free(process->comm); free(process->comm);
process->basenameOffset = -1;
process->comm = NULL; process->comm = NULL;
} }
if (existingProcess) if (existingProcess)