diff options
author | David Howells <dhowells@redhat.com> | 2020-01-14 16:06:14 +0000 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2020-01-14 09:40:06 -0800 |
commit | 8379bb84be757d5df2d818509faec5d66adb861d (patch) | |
tree | 4a5c150198cfdde4c07e4cfe55995c5cd51830df /kernel/cred.c | |
parent | 219d54332a09e8d8741c1e1982f5eae56099de85 (diff) | |
download | linux-8379bb84be757d5df2d818509faec5d66adb861d.tar.gz linux-8379bb84be757d5df2d818509faec5d66adb861d.tar.bz2 linux-8379bb84be757d5df2d818509faec5d66adb861d.zip |
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: 7743c48e54ee ("keys: Cache result of request_key*() temporarily in task_struct")
Signed-off-by: David Howells <dhowells@redhat.com>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'kernel/cred.c')
-rw-r--r-- | kernel/cred.c | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/kernel/cred.c b/kernel/cred.c index c0a4c12d38b2..56395be1c2a8 100644 --- a/kernel/cred.c +++ b/kernel/cred.c @@ -175,8 +175,8 @@ void exit_creds(struct task_struct *tsk) put_cred(cred); #ifdef CONFIG_KEYS_REQUEST_CACHE - key_put(current->cached_requested_key); - current->cached_requested_key = NULL; + key_put(tsk->cached_requested_key); + tsk->cached_requested_key = NULL; #endif } |