aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/security/keys/request_key.c
diff options
context:
space:
mode:
authorJann Horn <jannh@google.com>2019-03-27 16:55:08 +0100
committerJames Morris <james.morris@microsoft.com>2019-04-10 10:29:50 -0700
commit0b9dc6c9f01c4a726558b82a3b6082a89d264eb5 (patch)
tree1acfa81de568fa53ee14fac6219a140cd6560778 /security/keys/request_key.c
parentsecurity: don't use RCU accessors for cred->session_keyring (diff)
downloadwireguard-linux-0b9dc6c9f01c4a726558b82a3b6082a89d264eb5.tar.xz
wireguard-linux-0b9dc6c9f01c4a726558b82a3b6082a89d264eb5.zip
keys: safe concurrent user->{session,uid}_keyring access
The current code can perform concurrent updates and reads on user->session_keyring and user->uid_keyring. Add a comment to struct user_struct to document the nontrivial locking semantics, and use READ_ONCE() for unlocked readers and smp_store_release() for writers to prevent memory ordering issues. Fixes: 69664cf16af4 ("keys: don't generate user and user session keyrings unless they're accessed") Signed-off-by: Jann Horn <jannh@google.com> Signed-off-by: James Morris <james.morris@microsoft.com>
Diffstat (limited to 'security/keys/request_key.c')
-rw-r--r--security/keys/request_key.c5
1 files changed, 3 insertions, 2 deletions
diff --git a/security/keys/request_key.c b/security/keys/request_key.c
index db72dc4d7639..75d87f9e0f49 100644
--- a/security/keys/request_key.c
+++ b/security/keys/request_key.c
@@ -293,11 +293,12 @@ static int construct_get_dest_keyring(struct key **_dest_keyring)
/* fall through */
case KEY_REQKEY_DEFL_USER_SESSION_KEYRING:
dest_keyring =
- key_get(cred->user->session_keyring);
+ key_get(READ_ONCE(cred->user->session_keyring));
break;
case KEY_REQKEY_DEFL_USER_KEYRING:
- dest_keyring = key_get(cred->user->uid_keyring);
+ dest_keyring =
+ key_get(READ_ONCE(cred->user->uid_keyring));
break;
case KEY_REQKEY_DEFL_GROUP_KEYRING: