From: Yafang Shao <laoar.shao@gmail.com>
To: akpm@linux-foundation.org
Cc: torvalds@linux-foundation.org, alx@kernel.org,
justinstitt@google.com, ebiederm@xmission.com,
alexei.starovoitov@gmail.com, rostedt@goodmis.org,
catalin.marinas@arm.com, penguin-kernel@i-love.sakura.ne.jp,
linux-mm@kvack.org, linux-fsdevel@vger.kernel.org,
linux-trace-kernel@vger.kernel.org, audit@vger.kernel.org,
linux-security-module@vger.kernel.org, selinux@vger.kernel.org,
bpf@vger.kernel.org, netdev@vger.kernel.org,
dri-devel@lists.freedesktop.org,
Yafang Shao <laoar.shao@gmail.com>,
Alexander Viro <viro@zeniv.linux.org.uk>,
Christian Brauner <brauner@kernel.org>, Jan Kara <jack@suse.cz>,
Kees Cook <keescook@chromium.org>,
Matus Jokay <matus.jokay@stuba.sk>,
"Serge E. Hallyn" <serge@hallyn.com>
Subject: [PATCH v7 1/8] Get rid of __get_task_comm()
Date: Sat, 17 Aug 2024 10:56:17 +0800 [thread overview]
Message-ID: <20240817025624.13157-2-laoar.shao@gmail.com> (raw)
In-Reply-To: <20240817025624.13157-1-laoar.shao@gmail.com>
We want to eliminate the use of __get_task_comm() for the following
reasons:
- The task_lock() is unnecessary
Quoted from Linus [0]:
: Since user space can randomly change their names anyway, using locking
: was always wrong for readers (for writers it probably does make sense
: to have some lock - although practically speaking nobody cares there
: either, but at least for a writer some kind of race could have
: long-term mixed results
- The BUILD_BUG_ON() doesn't add any value
The only requirement is to ensure that the destination buffer is a valid
array.
- Zeroing is not necessary in current use cases
To avoid confusion, we should remove it. Moreover, not zeroing could
potentially make it easier to uncover bugs. If the caller needs a
zero-padded task name, it should be explicitly handled at the call site.
Suggested-by: Linus Torvalds <torvalds@linux-foundation.org>
Link: https://lore.kernel.org/all/CAHk-=wivfrF0_zvf+oj6==Sh=-npJooP8chLPEfaFV0oNYTTBA@mail.gmail.com [0]
Link: https://lore.kernel.org/all/CAHk-=whWtUC-AjmGJveAETKOMeMFSTwKwu99v7+b6AyHMmaDFA@mail.gmail.com/
Suggested-by: Alejandro Colomar <alx@kernel.org>
Link: https://lore.kernel.org/all/2jxak5v6dfxlpbxhpm3ey7oup4g2lnr3ueurfbosf5wdo65dk4@srb3hsk72zwq
Signed-off-by: Yafang Shao <laoar.shao@gmail.com>
Cc: Alexander Viro <viro@zeniv.linux.org.uk>
Cc: Christian Brauner <brauner@kernel.org>
Cc: Jan Kara <jack@suse.cz>
Cc: Eric Biederman <ebiederm@xmission.com>
Cc: Kees Cook <keescook@chromium.org>
Cc: Alexei Starovoitov <alexei.starovoitov@gmail.com>
Cc: Matus Jokay <matus.jokay@stuba.sk>
Cc: Alejandro Colomar <alx@kernel.org>
Cc: "Serge E. Hallyn" <serge@hallyn.com>
---
fs/exec.c | 10 ----------
fs/proc/array.c | 2 +-
include/linux/sched.h | 32 ++++++++++++++++++++++++++------
kernel/kthread.c | 2 +-
4 files changed, 28 insertions(+), 18 deletions(-)
diff --git a/fs/exec.c b/fs/exec.c
index a47d0e4c54f6..2e468ddd203a 100644
--- a/fs/exec.c
+++ b/fs/exec.c
@@ -1264,16 +1264,6 @@ static int unshare_sighand(struct task_struct *me)
return 0;
}
-char *__get_task_comm(char *buf, size_t buf_size, struct task_struct *tsk)
-{
- task_lock(tsk);
- /* Always NUL terminated and zero-padded */
- strscpy_pad(buf, tsk->comm, buf_size);
- task_unlock(tsk);
- return buf;
-}
-EXPORT_SYMBOL_GPL(__get_task_comm);
-
/*
* These functions flushes out all traces of the currently running executable
* so that a new one can be started
diff --git a/fs/proc/array.c b/fs/proc/array.c
index 34a47fb0c57f..55ed3510d2bb 100644
--- a/fs/proc/array.c
+++ b/fs/proc/array.c
@@ -109,7 +109,7 @@ void proc_task_name(struct seq_file *m, struct task_struct *p, bool escape)
else if (p->flags & PF_KTHREAD)
get_kthread_comm(tcomm, sizeof(tcomm), p);
else
- __get_task_comm(tcomm, sizeof(tcomm), p);
+ get_task_comm(tcomm, p);
if (escape)
seq_escape_str(m, tcomm, ESCAPE_SPACE | ESCAPE_SPECIAL, "\n\\");
diff --git a/include/linux/sched.h b/include/linux/sched.h
index 33dd8d9d2b85..5f1c8a58bb76 100644
--- a/include/linux/sched.h
+++ b/include/linux/sched.h
@@ -1096,9 +1096,12 @@ struct task_struct {
/*
* executable name, excluding path.
*
- * - normally initialized setup_new_exec()
- * - access it with [gs]et_task_comm()
- * - lock it with task_lock()
+ * - normally initialized begin_new_exec()
+ * - set it with set_task_comm()
+ * - strscpy_pad() to ensure it is always NUL-terminated and
+ * zero-padded
+ * - task_lock() to ensure the operation is atomic and the name is
+ * fully updated.
*/
char comm[TASK_COMM_LEN];
@@ -1912,10 +1915,27 @@ static inline void set_task_comm(struct task_struct *tsk, const char *from)
__set_task_comm(tsk, from, false);
}
-extern char *__get_task_comm(char *to, size_t len, struct task_struct *tsk);
+/*
+ * - Why not use task_lock()?
+ * User space can randomly change their names anyway, so locking for readers
+ * doesn't make sense. For writers, locking is probably necessary, as a race
+ * condition could lead to long-term mixed results.
+ * The strscpy_pad() in __set_task_comm() can ensure that the task comm is
+ * always NUL-terminated and zero-padded. Therefore the race condition between
+ * reader and writer is not an issue.
+ *
+ * - Why not use strscpy_pad()?
+ * While strscpy_pad() prevents writing garbage past the NUL terminator, which
+ * is useful when using the task name as a key in a hash map, most use cases
+ * don't require this. Zero-padding might confuse users if it’s unnecessary,
+ * and not zeroing might even make it easier to expose bugs. If you need a
+ * zero-padded task name, please handle that explicitly at the call site.
+ *
+ * - ARRAY_SIZE() can help ensure that @buf is indeed an array.
+ */
#define get_task_comm(buf, tsk) ({ \
- BUILD_BUG_ON(sizeof(buf) != TASK_COMM_LEN); \
- __get_task_comm(buf, sizeof(buf), tsk); \
+ strscpy(buf, (tsk)->comm, ARRAY_SIZE(buf)); \
+ buf; \
})
#ifdef CONFIG_SMP
diff --git a/kernel/kthread.c b/kernel/kthread.c
index f7be976ff88a..7d001d033cf9 100644
--- a/kernel/kthread.c
+++ b/kernel/kthread.c
@@ -101,7 +101,7 @@ void get_kthread_comm(char *buf, size_t buf_size, struct task_struct *tsk)
struct kthread *kthread = to_kthread(tsk);
if (!kthread || !kthread->full_name) {
- __get_task_comm(buf, buf_size, tsk);
+ strscpy(buf, tsk->comm, buf_size);
return;
}
--
2.43.5
next prev parent reply other threads:[~2024-08-17 2:56 UTC|newest]
Thread overview: 29+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-08-17 2:56 [PATCH v7 0/8] Improve the copy of task comm Yafang Shao
2024-08-17 2:56 ` Yafang Shao [this message]
2024-08-17 2:56 ` [PATCH v7 2/8] auditsc: Replace memcpy() with strscpy() Yafang Shao
2024-08-17 2:56 ` [PATCH v7 3/8] security: Replace memcpy() with get_task_comm() Yafang Shao
2024-08-17 2:56 ` [PATCH v7 4/8] bpftool: Ensure task comm is always NUL-terminated Yafang Shao
2024-08-17 8:38 ` Alejandro Colomar
2024-08-18 2:27 ` Yafang Shao
2024-08-18 8:25 ` Alejandro Colomar
2024-08-17 2:56 ` [PATCH v7 5/8] mm/util: Fix possible race condition in kstrdup() Yafang Shao
2024-08-17 8:48 ` Alejandro Colomar
2024-08-17 16:26 ` Linus Torvalds
2024-08-17 17:03 ` Alejandro Colomar
2024-09-28 21:17 ` Kees Cook
2024-09-29 7:58 ` Alejandro Colomar
2024-09-29 9:48 ` Alejandro Colomar
2024-09-26 17:35 ` Andy Shevchenko
2024-09-27 8:57 ` Yafang Shao
2024-09-28 21:14 ` Kees Cook
2024-08-17 2:56 ` [PATCH v7 6/8] mm/util: Deduplicate code in {kstrdup,kstrndup,kmemdup_nul} Yafang Shao
2024-08-17 2:56 ` [PATCH v7 6/8] mm/util: Deduplicate code in {kstrdup, kstrndup, kmemdup_nul} Yafang Shao
2024-08-17 8:57 ` [PATCH v7 6/8] mm/util: Deduplicate code in {kstrdup,kstrndup,kmemdup_nul} Alejandro Colomar
2024-08-17 9:05 ` Alejandro Colomar
2024-08-26 9:20 ` Alejandro Colomar
2024-08-26 13:13 ` Yafang Shao
2024-08-26 13:13 ` [PATCH v7 6/8] mm/util: Deduplicate code in {kstrdup, kstrndup, kmemdup_nul} Yafang Shao
2024-08-17 2:56 ` [PATCH v7 7/8] net: Replace strcpy() with strscpy() Yafang Shao
2024-08-17 2:56 ` [PATCH v7 8/8] drm: " Yafang Shao
2024-08-26 2:30 ` [PATCH v7 0/8] Improve the copy of task comm Yafang Shao
2024-08-28 1:19 ` Andrew Morton
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20240817025624.13157-2-laoar.shao@gmail.com \
--to=laoar.shao@gmail.com \
--cc=akpm@linux-foundation.org \
--cc=alexei.starovoitov@gmail.com \
--cc=alx@kernel.org \
--cc=audit@vger.kernel.org \
--cc=bpf@vger.kernel.org \
--cc=brauner@kernel.org \
--cc=catalin.marinas@arm.com \
--cc=dri-devel@lists.freedesktop.org \
--cc=ebiederm@xmission.com \
--cc=jack@suse.cz \
--cc=justinstitt@google.com \
--cc=keescook@chromium.org \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=linux-security-module@vger.kernel.org \
--cc=linux-trace-kernel@vger.kernel.org \
--cc=matus.jokay@stuba.sk \
--cc=netdev@vger.kernel.org \
--cc=penguin-kernel@i-love.sakura.ne.jp \
--cc=rostedt@goodmis.org \
--cc=selinux@vger.kernel.org \
--cc=serge@hallyn.com \
--cc=torvalds@linux-foundation.org \
--cc=viro@zeniv.linux.org.uk \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.