From 898c9c9c0f434d4229e8ceb7b279ea48edbc6248 Mon Sep 17 00:00:00 2001 From: Benny Baumann Date: Tue, 24 Feb 2026 18:44:50 +0100 Subject: [PATCH 1/3] Enforce const-correctness for String_strchrnul --- XUtils.h | 4 ++-- linux/LinuxProcessTable.c | 7 ++++--- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/XUtils.h b/XUtils.h index c78e51eab..ece065477 100644 --- a/XUtils.h +++ b/XUtils.h @@ -86,11 +86,11 @@ ATTR_NONNULL ATTR_MALLOC char* String_readLine(FILE* fp); ATTR_NONNULL ATTR_RETNONNULL -static inline char* String_strchrnul(const char* s, int c) { +static inline const char* String_strchrnul(const char* s, int c) { #ifdef HAVE_STRCHRNUL return strchrnul(s, c); #else - char* result = strchr(s, c); + const char* result = strchr(s, c); if (result) return result; return strchr(s, '\0'); diff --git a/linux/LinuxProcessTable.c b/linux/LinuxProcessTable.c index c94b2caac..b9f88ec4f 100644 --- a/linux/LinuxProcessTable.c +++ b/linux/LinuxProcessTable.c @@ -1047,7 +1047,7 @@ static void LinuxProcessTable_readCGroupFile(LinuxProcess* process, openat_arg_t if (!ok) break; - char* group = buffer; + const char* group = buffer; for (size_t i = 0; i < 2; i++) { group = String_strchrnul(group, ':'); if (!*group) @@ -1055,8 +1055,9 @@ static void LinuxProcessTable_readCGroupFile(LinuxProcess* process, openat_arg_t group++; } - char* eol = String_strchrnul(group, '\n'); - *eol = '\0'; + const char* eol = String_strchrnul(group, '\n'); + char* eol_w = &buffer[eol - buffer]; + *eol_w = '\0'; if (at != output) { *at = ';'; From 6b212fb25fbcd4f48b5a34e82e02c275ededa919 Mon Sep 17 00:00:00 2001 From: Benny Baumann Date: Tue, 24 Feb 2026 18:49:31 +0100 Subject: [PATCH 2/3] Properly check snprintf return value --- linux/LinuxProcessTable.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/linux/LinuxProcessTable.c b/linux/LinuxProcessTable.c index b9f88ec4f..058436eee 100644 --- a/linux/LinuxProcessTable.c +++ b/linux/LinuxProcessTable.c @@ -18,6 +18,7 @@ in the source distribution for its full text. #include #include #include +#include #include #include #include @@ -1040,7 +1041,7 @@ static void LinuxProcessTable_readCGroupFile(LinuxProcess* process, openat_arg_t char output[PROC_LINE_LENGTH + 1]; output[0] = '\0'; char* at = output; - int left = PROC_LINE_LENGTH; + size_t left = PROC_LINE_LENGTH; while (!feof(file) && left > 0) { char buffer[PROC_LINE_LENGTH + 1]; const char* ok = fgets(buffer, PROC_LINE_LENGTH, file); @@ -1064,8 +1065,14 @@ static void LinuxProcessTable_readCGroupFile(LinuxProcess* process, openat_arg_t at++; left--; } + int wrote = snprintf(at, left, "%s", group); - left -= wrote; + if (wrote < 0 || (size_t)wrote >= left) { + // Output was truncated, we are done + break; + } + + left -= (size_t)wrote; } fclose(file); From 08f73560afebbb73fffa51ff1954d0206b626c69 Mon Sep 17 00:00:00 2001 From: Benny Baumann Date: Tue, 24 Feb 2026 18:56:23 +0100 Subject: [PATCH 3/3] Properly advance pointer for write location --- linux/LinuxProcessTable.c | 1 + 1 file changed, 1 insertion(+) diff --git a/linux/LinuxProcessTable.c b/linux/LinuxProcessTable.c index 058436eee..706c4fe99 100644 --- a/linux/LinuxProcessTable.c +++ b/linux/LinuxProcessTable.c @@ -1072,6 +1072,7 @@ static void LinuxProcessTable_readCGroupFile(LinuxProcess* process, openat_arg_t break; } + at += (size_t)wrote; left -= (size_t)wrote; } fclose(file);