summaryrefslogtreecommitdiff
path: root/init
diff options
context:
space:
mode:
authorJann Horn <jannh@google.com>2026-08-06 22:15:54 +0200
committerPaul Moore <paul@paul-moore.com>2026-08-31 16:14:09 -0400
commitb030ffaedc1d638f232f6992406cdcdcc82d5602 (patch)
tree2802f24962af082633e86f5e86db43d7334e7d9c /init
parentcee9395acd8043be0644b25c34bfa86623f2b935 (diff)
downloadlinux-next-b030ffaedc1d638f232f6992406cdcdcc82d5602.tar.gz
linux-next-b030ffaedc1d638f232f6992406cdcdcc82d5602.zip
cred: clarify that task_struct::cred is only for the current task
The `cred` field in task_struct is currently marked as __rcu, but that's not true: It can point to credentials from access_override_creds(), which do not get freed with RCU delay. What actually protects task_struct::cred is that accessing it is only permitted for the current task (except for setting up a child during fork() or tearing down a dead process). (There is currently code in Smack that violates this rule, but that's a bug and causes UAF, I have sent a separate fix for that.) Clarify this, remove the __rcu marker, and remove RCU helpers from all accesses to this field. Signed-off-by: Jann Horn <jannh@google.com> Reviewed-by: Serge Hallyn <serge@hallyn.com> [PM: style tweak in security_init(), applied fixup from JH] Signed-off-by: Paul Moore <paul@paul-moore.com>
Diffstat (limited to 'init')
-rw-r--r--init/init_task.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/init/init_task.c b/init/init_task.c
index adb207cd987c..ce7c2b07d855 100644
--- a/init/init_task.c
+++ b/init/init_task.c
@@ -160,7 +160,7 @@ struct task_struct init_task __aligned(L1_CACHE_BYTES) = {
.sibling = LIST_HEAD_INIT(init_task.sibling),
.group_leader = &init_task,
RCU_POINTER_INITIALIZER(real_cred, &init_cred),
- RCU_POINTER_INITIALIZER(cred, &init_cred),
+ .cred = &init_cred,
.comm = INIT_TASK_COMM,
.thread = INIT_THREAD,
.real_fs = &init_fs,