summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2018-06-01 21:43:43 +0200
committerSven Eden <yamakuzure@gmx.net>2018-08-24 16:47:08 +0200
commit0ebd32d1cd1069a849c2c3968b632834fe1fc577 (patch)
treef095dbe6e17fe4b762060090f1b17a08916dd716
parentc7beed3ba1b20cd87dfce3ab622232ed9eb201f2 (diff)
missing: define kernel internal limit TASK_COMM_LEN in userspace too
We already use it at two places, and we are about to add one too. Arbitrary literally hardcoded limits suck.
-rw-r--r--src/basic/missing.h7
-rw-r--r--src/basic/process-util.c2
-rw-r--r--src/test/test-process-util.c2
3 files changed, 9 insertions, 2 deletions
diff --git a/src/basic/missing.h b/src/basic/missing.h
index 03b954d17..5b194261d 100644
--- a/src/basic/missing.h
+++ b/src/basic/missing.h
@@ -1416,4 +1416,11 @@ struct statx {
#define AT_STATX_DONT_SYNC 0x4000
#endif
+/* The maximum thread/process name length including trailing NUL byte. This mimics the kernel definition of the same
+ * name, which we need in userspace at various places but is not defined in userspace currently, neither under this
+ * name nor any other. */
+#ifndef TASK_COMM_LEN
+#define TASK_COMM_LEN 16
+#endif
+
#include "missing_syscall.h"
diff --git a/src/basic/process-util.c b/src/basic/process-util.c
index 1484a0011..f74eebd58 100644
--- a/src/basic/process-util.c
+++ b/src/basic/process-util.c
@@ -296,7 +296,7 @@ int rename_process(const char name[]) {
* can use PR_SET_NAME, which sets the thread name for the calling thread. */
if (prctl(PR_SET_NAME, name) < 0)
log_debug_errno(errno, "PR_SET_NAME failed: %m");
- if (l > 15) /* Linux process names can be 15 chars at max */
+ if (l >= TASK_COMM_LEN) /* Linux process names can be 15 chars at max */
truncated = true;
/* Second step, change glibc's ID of the process name. */
diff --git a/src/test/test-process-util.c b/src/test/test-process-util.c
index c5931c522..0d890fa46 100644
--- a/src/test/test-process-util.c
+++ b/src/test/test-process-util.c
@@ -375,7 +375,7 @@ static void test_rename_process_now(const char *p, int ret) {
assert_se(get_process_comm(0, &comm) >= 0);
log_info("comm = <%s>", comm);
- assert_se(strneq(comm, p, 15));
+ assert_se(strneq(comm, p, TASK_COMM_LEN-1));
assert_se(get_process_cmdline(0, 0, false, &cmdline) >= 0);
/* we cannot expect cmdline to be renamed properly without privileges */