From 92f14395cd43bb7969d3c7edaa53100d2f3c31d2 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Fri, 1 Jun 2018 21:43:43 +0200 Subject: 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. --- src/basic/missing.h | 7 +++++++ src/basic/process-util.c | 2 +- src/test/test-process-util.c | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/basic/missing.h b/src/basic/missing.h index e714078f31..dbdbd6f260 100644 --- a/src/basic/missing.h +++ b/src/basic/missing.h @@ -1407,4 +1407,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 a503aa50dc..058f077de0 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 fd5b44dc13..8b975ff988 100644 --- a/src/test/test-process-util.c +++ b/src/test/test-process-util.c @@ -366,7 +366,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 */ -- cgit v1.2.1