Skip to content

Commit

Permalink
Process: Use size_t for "cmdline" and "procExe" offsets
Browse files Browse the repository at this point in the history
Convert the members "cmdlineBasenameStart", "cmdlineBasenameEnd" and
"procExeBasenameOffset" in "Process" to size_t type. Also upgrade many
routines that search for "basenames", COMM, and PROC_EXE string to use
size_t for iterators.

The "cmdlineBasenameEnd" value is no longer allowed to negative. It is
now set to 0 during Process_init().

Signed-off-by: Kang-Che Sung <[email protected]>
  • Loading branch information
Explorer09 committed Feb 2, 2025
1 parent 65ce89a commit c256d1e
Show file tree
Hide file tree
Showing 9 changed files with 88 additions and 91 deletions.
71 changes: 34 additions & 37 deletions Process.c
Original file line number Diff line number Diff line change
Expand Up @@ -64,28 +64,25 @@ void Process_fillStarttimeBuffer(Process* this) {
*/
#define TASK_COMM_LEN 16

static bool findCommInCmdline(const char* comm, const char* cmdline, int cmdlineBasenameStart, int* pCommStart, int* pCommLen) {
static bool findCommInCmdline(const char* comm, const char* cmdline, size_t cmdlineBasenameStart, size_t* pCommStart, size_t* pCommLen) {
/* Try to find procComm in tokenized cmdline - this might in rare cases
* mis-identify a string or fail, if comm or cmdline had been unsuitably
* modified by the process */
const char* tokenBase;
size_t tokenLen;
const size_t commLen = strlen(comm);

if (cmdlineBasenameStart < 0)
return false;

for (const char* token = cmdline + cmdlineBasenameStart; *token;) {
for (tokenBase = token; *token && *token != '\n'; ++token) {
if (*token == '/') {
tokenBase = token + 1;
}
}
tokenLen = token - tokenBase;
tokenLen = (size_t)(token - tokenBase);

if ((tokenLen == commLen || (tokenLen > commLen && commLen == (TASK_COMM_LEN - 1))) &&
strncmp(tokenBase, comm, commLen) == 0) {
*pCommStart = tokenBase - cmdline;
*pCommStart = (size_t)(tokenBase - cmdline);
*pCommLen = tokenLen;
return true;
}
Expand All @@ -99,8 +96,8 @@ static bool findCommInCmdline(const char* comm, const char* cmdline, int cmdline
return false;
}

static int matchCmdlinePrefixWithExeSuffix(const char* cmdline, int* cmdlineBasenameStart, const char* exe, int exeBaseOffset, int exeBaseLen) {
int matchLen; /* matching length to be returned */
static size_t matchCmdlinePrefixWithExeSuffix(const char* cmdline, size_t* cmdlineBasenameStart, const char* exe, size_t exeBaseOffset, size_t exeBaseLen) {
size_t matchLen; /* matching length to be returned */

/* cmdline prefix is an absolute path: it must match whole exe. */
if (cmdline[0] == '/') {
Expand All @@ -126,7 +123,7 @@ static int matchCmdlinePrefixWithExeSuffix(const char* cmdline, int* cmdlineBase
*
* So if needed, we adjust cmdlineBaseOffset to the previous (if any)
* component of the cmdline relative path, and retry the procedure. */
int cmdlineBaseOffset = *cmdlineBasenameStart;
size_t cmdlineBaseOffset = *cmdlineBasenameStart;
bool delimFound = true; /* if valid basename delimiter found */
do {
/* match basename */
Expand All @@ -135,14 +132,14 @@ static int matchCmdlinePrefixWithExeSuffix(const char* cmdline, int* cmdlineBase
strncmp(cmdline + cmdlineBaseOffset, exe + exeBaseOffset, exeBaseLen) == 0) {
char delim = cmdline[matchLen];
if (delim == 0 || delim == '\n' || delim == ' ') {
int i, j;
size_t i, j;
/* reverse match the cmdline prefix and exe suffix */
for (i = cmdlineBaseOffset - 1, j = exeBaseOffset - 1;
i >= 0 && j >= 0 && cmdline[i] == exe[j]; --i, --j)
i != (size_t)-1 && j != (size_t)-1 && cmdline[i] == exe[j]; --i, --j)
;

/* full match, with exe suffix being a valid relative path */
if (i < 0 && j >= 0 && exe[j] == '/') {
if (i == (size_t)-1 && j != (size_t)-1 && exe[j] == '/') {
*cmdlineBasenameStart = cmdlineBaseOffset;
return matchLen;
}
Expand All @@ -152,6 +149,9 @@ static int matchCmdlinePrefixWithExeSuffix(const char* cmdline, int* cmdlineBase
/* Try to find the previous potential cmdlineBaseOffset - it would be
* preceded by '/' or nothing, and delimited by ' ' or '\n' */
delimFound = false;
if (cmdlineBaseOffset <= 2) {
return 0;
}
for (cmdlineBaseOffset -= 2; cmdlineBaseOffset > 0; --cmdlineBaseOffset) {
if (delimFound) {
if (cmdline[cmdlineBaseOffset - 1] == '/') {
Expand Down Expand Up @@ -312,8 +312,8 @@ void Process_makeCommandStr(Process* this, const Settings* settings) {
char* strStart = mc->str;
char* str = strStart;

int cmdlineBasenameStart = this->cmdlineBasenameStart;
int cmdlineBasenameLen = 0;
size_t cmdlineBasenameStart = this->cmdlineBasenameStart;
size_t cmdlineBasenameLen = 0;
if (this->cmdlineBasenameEnd > this->cmdlineBasenameStart)
cmdlineBasenameLen = this->cmdlineBasenameEnd - this->cmdlineBasenameStart;

Expand All @@ -323,20 +323,18 @@ void Process_makeCommandStr(Process* this, const Settings* settings) {
cmdline = "(zombie)";
}

assert(cmdlineBasenameStart >= 0);
assert(cmdlineBasenameStart <= (int)strlen(cmdline));
assert(cmdlineBasenameStart <= strlen(cmdline));

int exeLen = 0;
int exeBasenameOffset = 0;
int exeBasenameLen = 0;
int matchLen = 0;
size_t exeLen = 0;
size_t exeBasenameOffset = 0;
size_t exeBasenameLen = 0;
size_t matchLen = 0;
if (procExe) {
exeLen = strlen(procExe);
exeBasenameOffset = this->procExeBasenameOffset;
exeBasenameLen = exeLen - exeBasenameOffset;

assert(exeBasenameOffset >= 0);
assert(exeBasenameOffset <= (int)strlen(procExe));
assert(exeBasenameOffset <= strlen(procExe));

if (this->cmdline) {
matchLen = matchCmdlinePrefixWithExeSuffix(this->cmdline, &cmdlineBasenameStart, procExe, exeBasenameOffset, exeBasenameLen);
Expand Down Expand Up @@ -376,7 +374,7 @@ void Process_makeCommandStr(Process* this, const Settings* settings) {
return;
}

int commLen = 0;
size_t commLen = 0;

bool haveCommInExe = false;
if (procExe && procComm && (!Process_isUserlandThread(this) || showThreadNames)) {
Expand All @@ -387,7 +385,7 @@ void Process_makeCommandStr(Process* this, const Settings* settings) {
}

bool haveCommInCmdline = false;
int commStart = 0;
size_t commStart = 0;

if (!haveCommInExe && this->cmdline && procComm && searchCommInCmdline && (!Process_isUserlandThread(this) || showThreadNames)) {
haveCommInCmdline = findCommInCmdline(procComm, cmdline, cmdlineBasenameStart, &commStart, &commLen);
Expand Down Expand Up @@ -471,20 +469,20 @@ void Process_writeCommand(const Process* this, int attr, int baseAttr, RichStrin
const ProcessMergedCommand* mc = &this->mergedCommand;
const char* mergedCommand = mc->str;

int strStart = RichString_size(str);
size_t strStart = RichString_size(str);

const Settings* settings = this->super.host->settings;
const bool highlightBaseName = settings->highlightBaseName;
const bool highlightSeparator = true;
const bool highlightDeleted = settings->highlightDeletedExe;

if (!mergedCommand) {
int len = 0;
size_t len = 0;
const char* cmdline = this->cmdline;

if (highlightBaseName || !settings->showProgramPath) {
int basename = 0;
for (int i = 0; i < this->cmdlineBasenameEnd; i++) {
size_t basename = 0;
for (size_t i = 0; i < this->cmdlineBasenameEnd; i++) {
if (cmdline[i] == '/') {
basename = i + 1;
} else if (cmdline[i] == ':') {
Expand Down Expand Up @@ -876,7 +874,7 @@ bool Process_rowMatchesFilter(const Row* super, const Table* table) {
void Process_init(Process* this, const Machine* host) {
Row_init(&this->super, host);

this->cmdlineBasenameEnd = -1;
this->cmdlineBasenameEnd = 0;
this->st_uid = (uid_t)-1;
}

Expand Down Expand Up @@ -1028,12 +1026,12 @@ void Process_updateComm(Process* this, const char* comm) {
this->mergedCommand.lastUpdate = 0;
}

static int skipPotentialPath(const char* cmdline, int end) {
static size_t skipPotentialPath(const char* cmdline, size_t end) {
if (cmdline[0] != '/')
return 0;

int slash = 0;
for (int i = 1; i < end; i++) {
size_t slash = 0;
for (size_t i = 1; i < end; i++) {
if (cmdline[i] == '/' && cmdline[i + 1] != '\0') {
slash = i + 1;
continue;
Expand All @@ -1049,11 +1047,10 @@ static int skipPotentialPath(const char* cmdline, int end) {
return slash;
}

void Process_updateCmdline(Process* this, const char* cmdline, int basenameStart, int basenameEnd) {
assert(basenameStart >= 0);
assert((cmdline && basenameStart < (int)strlen(cmdline)) || (!cmdline && basenameStart == 0));
void Process_updateCmdline(Process* this, const char* cmdline, size_t basenameStart, size_t basenameEnd) {
assert((cmdline && basenameStart < strlen(cmdline)) || (!cmdline && basenameStart == 0));
assert((basenameEnd > basenameStart) || (basenameEnd == 0 && basenameStart == 0));
assert((cmdline && basenameEnd <= (int)strlen(cmdline)) || (!cmdline && basenameEnd == 0));
assert((cmdline && basenameEnd <= strlen(cmdline)) || (!cmdline && basenameEnd == 0));

if (!this->cmdline && !cmdline)
return;
Expand Down Expand Up @@ -1086,7 +1083,7 @@ void Process_updateExe(Process* this, const char* exe) {
if (exe) {
this->procExe = xStrdup(exe);
const char* lastSlash = strrchr(exe, '/');
this->procExeBasenameOffset = (lastSlash && *(lastSlash + 1) != '\0' && lastSlash != exe) ? (lastSlash - exe + 1) : 0;
this->procExeBasenameOffset = (lastSlash && *(lastSlash + 1) != '\0' && lastSlash != exe) ? (size_t)(lastSlash - exe + 1) : 0;
} else {
this->procExe = NULL;
this->procExeBasenameOffset = 0;
Expand Down
8 changes: 4 additions & 4 deletions Process.h
Original file line number Diff line number Diff line change
Expand Up @@ -129,10 +129,10 @@ typedef struct Process_ {
char* cmdline;

/* End Offset in cmdline of the process basename */
int cmdlineBasenameEnd;
size_t cmdlineBasenameEnd;

/* Start Offset in cmdline of the process basename */
int cmdlineBasenameStart;
size_t cmdlineBasenameStart;

/* The process' "command" name */
char* procComm;
Expand All @@ -144,7 +144,7 @@ typedef struct Process_ {
char* procCwd;

/* Offset in procExe of the process basename */
int procExeBasenameOffset;
size_t procExeBasenameOffset;

/* Tells if the executable has been replaced in the filesystem since start */
bool procExeDeleted;
Expand Down Expand Up @@ -326,7 +326,7 @@ int Process_compareByKey_Base(const Process* p1, const Process* p2, ProcessField
const char* Process_getCommand(const Process* this);

void Process_updateComm(Process* this, const char* comm);
void Process_updateCmdline(Process* this, const char* cmdline, int basenameStart, int basenameEnd);
void Process_updateCmdline(Process* this, const char* cmdline, size_t basenameStart, size_t basenameEnd);
void Process_updateExe(Process* this, const char* exe);

/* This function constructs the string that is displayed by
Expand Down
6 changes: 3 additions & 3 deletions darwin/DarwinProcess.c
Original file line number Diff line number Diff line change
Expand Up @@ -232,7 +232,7 @@ static void DarwinProcess_updateCmdLine(const struct kinfo_proc* k, Process* pro
/* Save where the argv[0] string starts. */
sp = cp;

int end = 0;
size_t end = 0;
for ( np = NULL; c < nargs && cp < &procargs[size]; cp++ ) {
if ( *cp == '\0' ) {
c++;
Expand All @@ -243,7 +243,7 @@ static void DarwinProcess_updateCmdLine(const struct kinfo_proc* k, Process* pro
/* Note location of current '\0'. */
np = cp;
if (end == 0) {
end = cp - sp;
end = (size_t)(cp - sp);
}
}
}
Expand All @@ -257,7 +257,7 @@ static void DarwinProcess_updateCmdLine(const struct kinfo_proc* k, Process* pro
goto ERROR_B;
}
if (end == 0) {
end = np - sp;
end = (size_t)(np - sp);
}

Process_updateCmdline(proc, sp, 0, end);
Expand Down
8 changes: 4 additions & 4 deletions dragonflybsd/DragonFlyBSDProcessTable.c
Original file line number Diff line number Diff line change
Expand Up @@ -106,18 +106,18 @@ static void DragonFlyBSDProcessTable_updateProcessName(kvm_t* kd, const struct k
}

size_t len = 0;
for (int i = 0; argv[i]; i++) {
for (size_t i = 0; argv[i]; i++) {
len += strlen(argv[i]) + 1;
}

char* cmdline = xMalloc(len);

char* at = cmdline;
int end = 0;
for (int i = 0; argv[i]; i++) {
size_t end = 0;
for (size_t i = 0; argv[i]; i++) {
at = stpcpy(at, argv[i]);
if (end == 0) {
end = at - cmdline;
end = (size_t)(at - cmdline);
}
*at++ = ' ';
}
Expand Down
8 changes: 4 additions & 4 deletions freebsd/FreeBSDProcessTable.c
Original file line number Diff line number Diff line change
Expand Up @@ -108,17 +108,17 @@ static void FreeBSDProcessTable_updateProcessName(kvm_t* kd, const struct kinfo_
}

size_t len = 0;
for (int i = 0; argv[i]; i++) {
for (size_t i = 0; argv[i]; i++) {
len += strlen(argv[i]) + 1;
}

char* cmdline = xMalloc(len);
char* at = cmdline;
int end = 0;
for (int i = 0; argv[i]; i++) {
size_t end = 0;
for (size_t i = 0; argv[i]; i++) {
at = stpcpy(at, argv[i]);
if (end == 0) {
end = at - cmdline;
end = (size_t)(at - cmdline);
}
*at++ = ' ';
}
Expand Down
Loading

0 comments on commit c256d1e

Please sign in to comment.