diff options
Diffstat (limited to 'security/keys/permission.c')
-rw-r--r-- | security/keys/permission.c | 24 |
1 files changed, 13 insertions, 11 deletions
diff --git a/security/keys/permission.c b/security/keys/permission.c index 13c36164f28..5d9fc7b93f2 100644 --- a/security/keys/permission.c +++ b/security/keys/permission.c | |||
@@ -14,24 +14,27 @@ | |||
14 | #include "internal.h" | 14 | #include "internal.h" |
15 | 15 | ||
16 | /*****************************************************************************/ | 16 | /*****************************************************************************/ |
17 | /* | 17 | /** |
18 | * check to see whether permission is granted to use a key in the desired way, | 18 | * key_task_permission - Check a key can be used |
19 | * but permit the security modules to override | 19 | * @key_ref: The key to check |
20 | * @cred: The credentials to use | ||
21 | * @perm: The permissions to check for | ||
22 | * | ||
23 | * Check to see whether permission is granted to use a key in the desired way, | ||
24 | * but permit the security modules to override. | ||
25 | * | ||
26 | * The caller must hold either a ref on cred or must hold the RCU readlock or a | ||
27 | * spinlock. | ||
20 | */ | 28 | */ |
21 | int key_task_permission(const key_ref_t key_ref, | 29 | int key_task_permission(const key_ref_t key_ref, const struct cred *cred, |
22 | struct task_struct *context, | ||
23 | key_perm_t perm) | 30 | key_perm_t perm) |
24 | { | 31 | { |
25 | const struct cred *cred; | ||
26 | struct key *key; | 32 | struct key *key; |
27 | key_perm_t kperm; | 33 | key_perm_t kperm; |
28 | int ret; | 34 | int ret; |
29 | 35 | ||
30 | key = key_ref_to_ptr(key_ref); | 36 | key = key_ref_to_ptr(key_ref); |
31 | 37 | ||
32 | rcu_read_lock(); | ||
33 | cred = __task_cred(context); | ||
34 | |||
35 | /* use the second 8-bits of permissions for keys the caller owns */ | 38 | /* use the second 8-bits of permissions for keys the caller owns */ |
36 | if (key->uid == cred->fsuid) { | 39 | if (key->uid == cred->fsuid) { |
37 | kperm = key->perm >> 16; | 40 | kperm = key->perm >> 16; |
@@ -57,7 +60,6 @@ int key_task_permission(const key_ref_t key_ref, | |||
57 | kperm = key->perm; | 60 | kperm = key->perm; |
58 | 61 | ||
59 | use_these_perms: | 62 | use_these_perms: |
60 | rcu_read_lock(); | ||
61 | 63 | ||
62 | /* use the top 8-bits of permissions for keys the caller possesses | 64 | /* use the top 8-bits of permissions for keys the caller possesses |
63 | * - possessor permissions are additive with other permissions | 65 | * - possessor permissions are additive with other permissions |
@@ -71,7 +73,7 @@ use_these_perms: | |||
71 | return -EACCES; | 73 | return -EACCES; |
72 | 74 | ||
73 | /* let LSM be the final arbiter */ | 75 | /* let LSM be the final arbiter */ |
74 | return security_key_permission(key_ref, context, perm); | 76 | return security_key_permission(key_ref, cred, perm); |
75 | 77 | ||
76 | } /* end key_task_permission() */ | 78 | } /* end key_task_permission() */ |
77 | 79 | ||