Commit 8379bb84 authored by David Howells's avatar David Howells Committed by Linus Torvalds

keys: Fix request_key() cache

When the key cached by request_key() and co.  is cleaned up on exit(),
the code looks in the wrong task_struct, and so clears the wrong cache.
This leads to anomalies in key refcounting when doing, say, a kernel
build on an afs volume, that then trigger kasan to report a
use-after-free when the key is viewed in /proc/keys.

Fix this by making exit_creds() look in the passed-in task_struct rather
than in current (the task_struct cleanup code is deferred by RCU and
potentially run in another task).

Fixes: 7743c48e ("keys: Cache result of request_key*() temporarily in task_struct")
Signed-off-by: default avatarDavid Howells <dhowells@redhat.com>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 219d5433
...@@ -175,8 +175,8 @@ void exit_creds(struct task_struct *tsk) ...@@ -175,8 +175,8 @@ void exit_creds(struct task_struct *tsk)
put_cred(cred); put_cred(cred);
#ifdef CONFIG_KEYS_REQUEST_CACHE #ifdef CONFIG_KEYS_REQUEST_CACHE
key_put(current->cached_requested_key); key_put(tsk->cached_requested_key);
current->cached_requested_key = NULL; tsk->cached_requested_key = NULL;
#endif #endif
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment