Skip to content

Commit c256d1e

Browse files
committed
Process: Use size_t for "cmdline" and "procExe" offsets
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]>
1 parent 65ce89a commit c256d1e

File tree

9 files changed

+88
-91
lines changed

9 files changed

+88
-91
lines changed

Process.c

Lines changed: 34 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -64,28 +64,25 @@ void Process_fillStarttimeBuffer(Process* this) {
6464
*/
6565
#define TASK_COMM_LEN 16
6666

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

75-
if (cmdlineBasenameStart < 0)
76-
return false;
77-
7875
for (const char* token = cmdline + cmdlineBasenameStart; *token;) {
7976
for (tokenBase = token; *token && *token != '\n'; ++token) {
8077
if (*token == '/') {
8178
tokenBase = token + 1;
8279
}
8380
}
84-
tokenLen = token - tokenBase;
81+
tokenLen = (size_t)(token - tokenBase);
8582

8683
if ((tokenLen == commLen || (tokenLen > commLen && commLen == (TASK_COMM_LEN - 1))) &&
8784
strncmp(tokenBase, comm, commLen) == 0) {
88-
*pCommStart = tokenBase - cmdline;
85+
*pCommStart = (size_t)(tokenBase - cmdline);
8986
*pCommLen = tokenLen;
9087
return true;
9188
}
@@ -99,8 +96,8 @@ static bool findCommInCmdline(const char* comm, const char* cmdline, int cmdline
9996
return false;
10097
}
10198

102-
static int matchCmdlinePrefixWithExeSuffix(const char* cmdline, int* cmdlineBasenameStart, const char* exe, int exeBaseOffset, int exeBaseLen) {
103-
int matchLen; /* matching length to be returned */
99+
static size_t matchCmdlinePrefixWithExeSuffix(const char* cmdline, size_t* cmdlineBasenameStart, const char* exe, size_t exeBaseOffset, size_t exeBaseLen) {
100+
size_t matchLen; /* matching length to be returned */
104101

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

144141
/* full match, with exe suffix being a valid relative path */
145-
if (i < 0 && j >= 0 && exe[j] == '/') {
142+
if (i == (size_t)-1 && j != (size_t)-1 && exe[j] == '/') {
146143
*cmdlineBasenameStart = cmdlineBaseOffset;
147144
return matchLen;
148145
}
@@ -152,6 +149,9 @@ static int matchCmdlinePrefixWithExeSuffix(const char* cmdline, int* cmdlineBase
152149
/* Try to find the previous potential cmdlineBaseOffset - it would be
153150
* preceded by '/' or nothing, and delimited by ' ' or '\n' */
154151
delimFound = false;
152+
if (cmdlineBaseOffset <= 2) {
153+
return 0;
154+
}
155155
for (cmdlineBaseOffset -= 2; cmdlineBaseOffset > 0; --cmdlineBaseOffset) {
156156
if (delimFound) {
157157
if (cmdline[cmdlineBaseOffset - 1] == '/') {
@@ -312,8 +312,8 @@ void Process_makeCommandStr(Process* this, const Settings* settings) {
312312
char* strStart = mc->str;
313313
char* str = strStart;
314314

315-
int cmdlineBasenameStart = this->cmdlineBasenameStart;
316-
int cmdlineBasenameLen = 0;
315+
size_t cmdlineBasenameStart = this->cmdlineBasenameStart;
316+
size_t cmdlineBasenameLen = 0;
317317
if (this->cmdlineBasenameEnd > this->cmdlineBasenameStart)
318318
cmdlineBasenameLen = this->cmdlineBasenameEnd - this->cmdlineBasenameStart;
319319

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

326-
assert(cmdlineBasenameStart >= 0);
327-
assert(cmdlineBasenameStart <= (int)strlen(cmdline));
326+
assert(cmdlineBasenameStart <= strlen(cmdline));
328327

329-
int exeLen = 0;
330-
int exeBasenameOffset = 0;
331-
int exeBasenameLen = 0;
332-
int matchLen = 0;
328+
size_t exeLen = 0;
329+
size_t exeBasenameOffset = 0;
330+
size_t exeBasenameLen = 0;
331+
size_t matchLen = 0;
333332
if (procExe) {
334333
exeLen = strlen(procExe);
335334
exeBasenameOffset = this->procExeBasenameOffset;
336335
exeBasenameLen = exeLen - exeBasenameOffset;
337336

338-
assert(exeBasenameOffset >= 0);
339-
assert(exeBasenameOffset <= (int)strlen(procExe));
337+
assert(exeBasenameOffset <= strlen(procExe));
340338

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

379-
int commLen = 0;
377+
size_t commLen = 0;
380378

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

389387
bool haveCommInCmdline = false;
390-
int commStart = 0;
388+
size_t commStart = 0;
391389

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

474-
int strStart = RichString_size(str);
472+
size_t strStart = RichString_size(str);
475473

476474
const Settings* settings = this->super.host->settings;
477475
const bool highlightBaseName = settings->highlightBaseName;
478476
const bool highlightSeparator = true;
479477
const bool highlightDeleted = settings->highlightDeletedExe;
480478

481479
if (!mergedCommand) {
482-
int len = 0;
480+
size_t len = 0;
483481
const char* cmdline = this->cmdline;
484482

485483
if (highlightBaseName || !settings->showProgramPath) {
486-
int basename = 0;
487-
for (int i = 0; i < this->cmdlineBasenameEnd; i++) {
484+
size_t basename = 0;
485+
for (size_t i = 0; i < this->cmdlineBasenameEnd; i++) {
488486
if (cmdline[i] == '/') {
489487
basename = i + 1;
490488
} else if (cmdline[i] == ':') {
@@ -876,7 +874,7 @@ bool Process_rowMatchesFilter(const Row* super, const Table* table) {
876874
void Process_init(Process* this, const Machine* host) {
877875
Row_init(&this->super, host);
878876

879-
this->cmdlineBasenameEnd = -1;
877+
this->cmdlineBasenameEnd = 0;
880878
this->st_uid = (uid_t)-1;
881879
}
882880

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

1031-
static int skipPotentialPath(const char* cmdline, int end) {
1029+
static size_t skipPotentialPath(const char* cmdline, size_t end) {
10321030
if (cmdline[0] != '/')
10331031
return 0;
10341032

1035-
int slash = 0;
1036-
for (int i = 1; i < end; i++) {
1033+
size_t slash = 0;
1034+
for (size_t i = 1; i < end; i++) {
10371035
if (cmdline[i] == '/' && cmdline[i + 1] != '\0') {
10381036
slash = i + 1;
10391037
continue;
@@ -1049,11 +1047,10 @@ static int skipPotentialPath(const char* cmdline, int end) {
10491047
return slash;
10501048
}
10511049

1052-
void Process_updateCmdline(Process* this, const char* cmdline, int basenameStart, int basenameEnd) {
1053-
assert(basenameStart >= 0);
1054-
assert((cmdline && basenameStart < (int)strlen(cmdline)) || (!cmdline && basenameStart == 0));
1050+
void Process_updateCmdline(Process* this, const char* cmdline, size_t basenameStart, size_t basenameEnd) {
1051+
assert((cmdline && basenameStart < strlen(cmdline)) || (!cmdline && basenameStart == 0));
10551052
assert((basenameEnd > basenameStart) || (basenameEnd == 0 && basenameStart == 0));
1056-
assert((cmdline && basenameEnd <= (int)strlen(cmdline)) || (!cmdline && basenameEnd == 0));
1053+
assert((cmdline && basenameEnd <= strlen(cmdline)) || (!cmdline && basenameEnd == 0));
10571054

10581055
if (!this->cmdline && !cmdline)
10591056
return;
@@ -1086,7 +1083,7 @@ void Process_updateExe(Process* this, const char* exe) {
10861083
if (exe) {
10871084
this->procExe = xStrdup(exe);
10881085
const char* lastSlash = strrchr(exe, '/');
1089-
this->procExeBasenameOffset = (lastSlash && *(lastSlash + 1) != '\0' && lastSlash != exe) ? (lastSlash - exe + 1) : 0;
1086+
this->procExeBasenameOffset = (lastSlash && *(lastSlash + 1) != '\0' && lastSlash != exe) ? (size_t)(lastSlash - exe + 1) : 0;
10901087
} else {
10911088
this->procExe = NULL;
10921089
this->procExeBasenameOffset = 0;

Process.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -129,10 +129,10 @@ typedef struct Process_ {
129129
char* cmdline;
130130

131131
/* End Offset in cmdline of the process basename */
132-
int cmdlineBasenameEnd;
132+
size_t cmdlineBasenameEnd;
133133

134134
/* Start Offset in cmdline of the process basename */
135-
int cmdlineBasenameStart;
135+
size_t cmdlineBasenameStart;
136136

137137
/* The process' "command" name */
138138
char* procComm;
@@ -144,7 +144,7 @@ typedef struct Process_ {
144144
char* procCwd;
145145

146146
/* Offset in procExe of the process basename */
147-
int procExeBasenameOffset;
147+
size_t procExeBasenameOffset;
148148

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

328328
void Process_updateComm(Process* this, const char* comm);
329-
void Process_updateCmdline(Process* this, const char* cmdline, int basenameStart, int basenameEnd);
329+
void Process_updateCmdline(Process* this, const char* cmdline, size_t basenameStart, size_t basenameEnd);
330330
void Process_updateExe(Process* this, const char* exe);
331331

332332
/* This function constructs the string that is displayed by

darwin/DarwinProcess.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -232,7 +232,7 @@ static void DarwinProcess_updateCmdLine(const struct kinfo_proc* k, Process* pro
232232
/* Save where the argv[0] string starts. */
233233
sp = cp;
234234

235-
int end = 0;
235+
size_t end = 0;
236236
for ( np = NULL; c < nargs && cp < &procargs[size]; cp++ ) {
237237
if ( *cp == '\0' ) {
238238
c++;
@@ -243,7 +243,7 @@ static void DarwinProcess_updateCmdLine(const struct kinfo_proc* k, Process* pro
243243
/* Note location of current '\0'. */
244244
np = cp;
245245
if (end == 0) {
246-
end = cp - sp;
246+
end = (size_t)(cp - sp);
247247
}
248248
}
249249
}
@@ -257,7 +257,7 @@ static void DarwinProcess_updateCmdLine(const struct kinfo_proc* k, Process* pro
257257
goto ERROR_B;
258258
}
259259
if (end == 0) {
260-
end = np - sp;
260+
end = (size_t)(np - sp);
261261
}
262262

263263
Process_updateCmdline(proc, sp, 0, end);

dragonflybsd/DragonFlyBSDProcessTable.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -106,18 +106,18 @@ static void DragonFlyBSDProcessTable_updateProcessName(kvm_t* kd, const struct k
106106
}
107107

108108
size_t len = 0;
109-
for (int i = 0; argv[i]; i++) {
109+
for (size_t i = 0; argv[i]; i++) {
110110
len += strlen(argv[i]) + 1;
111111
}
112112

113113
char* cmdline = xMalloc(len);
114114

115115
char* at = cmdline;
116-
int end = 0;
117-
for (int i = 0; argv[i]; i++) {
116+
size_t end = 0;
117+
for (size_t i = 0; argv[i]; i++) {
118118
at = stpcpy(at, argv[i]);
119119
if (end == 0) {
120-
end = at - cmdline;
120+
end = (size_t)(at - cmdline);
121121
}
122122
*at++ = ' ';
123123
}

freebsd/FreeBSDProcessTable.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -108,17 +108,17 @@ static void FreeBSDProcessTable_updateProcessName(kvm_t* kd, const struct kinfo_
108108
}
109109

110110
size_t len = 0;
111-
for (int i = 0; argv[i]; i++) {
111+
for (size_t i = 0; argv[i]; i++) {
112112
len += strlen(argv[i]) + 1;
113113
}
114114

115115
char* cmdline = xMalloc(len);
116116
char* at = cmdline;
117-
int end = 0;
118-
for (int i = 0; argv[i]; i++) {
117+
size_t end = 0;
118+
for (size_t i = 0; argv[i]; i++) {
119119
at = stpcpy(at, argv[i]);
120120
if (end == 0) {
121-
end = at - cmdline;
121+
end = (size_t)(at - cmdline);
122122
}
123123
*at++ = ' ';
124124
}

0 commit comments

Comments
 (0)