diff options
Diffstat (limited to 'security/keys/permission.c')
-rw-r--r-- | security/keys/permission.c | 29 |
1 files changed, 17 insertions, 12 deletions
diff --git a/security/keys/permission.c b/security/keys/permission.c index 3b41f9b52537..5d9fc7b93f2e 100644 --- a/security/keys/permission.c +++ b/security/keys/permission.c | |||
@@ -14,12 +14,19 @@ | |||
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 | struct key *key; | 32 | struct key *key; |
@@ -29,7 +36,7 @@ int key_task_permission(const key_ref_t key_ref, | |||
29 | key = key_ref_to_ptr(key_ref); | 36 | key = key_ref_to_ptr(key_ref); |
30 | 37 | ||
31 | /* 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 */ |
32 | if (key->uid == context->fsuid) { | 39 | if (key->uid == cred->fsuid) { |
33 | kperm = key->perm >> 16; | 40 | kperm = key->perm >> 16; |
34 | goto use_these_perms; | 41 | goto use_these_perms; |
35 | } | 42 | } |
@@ -37,15 +44,12 @@ int key_task_permission(const key_ref_t key_ref, | |||
37 | /* use the third 8-bits of permissions for keys the caller has a group | 44 | /* use the third 8-bits of permissions for keys the caller has a group |
38 | * membership in common with */ | 45 | * membership in common with */ |
39 | if (key->gid != -1 && key->perm & KEY_GRP_ALL) { | 46 | if (key->gid != -1 && key->perm & KEY_GRP_ALL) { |
40 | if (key->gid == context->fsgid) { | 47 | if (key->gid == cred->fsgid) { |
41 | kperm = key->perm >> 8; | 48 | kperm = key->perm >> 8; |
42 | goto use_these_perms; | 49 | goto use_these_perms; |
43 | } | 50 | } |
44 | 51 | ||
45 | task_lock(context); | 52 | ret = groups_search(cred->group_info, key->gid); |
46 | ret = groups_search(context->group_info, key->gid); | ||
47 | task_unlock(context); | ||
48 | |||
49 | if (ret) { | 53 | if (ret) { |
50 | kperm = key->perm >> 8; | 54 | kperm = key->perm >> 8; |
51 | goto use_these_perms; | 55 | goto use_these_perms; |
@@ -56,6 +60,7 @@ int key_task_permission(const key_ref_t key_ref, | |||
56 | kperm = key->perm; | 60 | kperm = key->perm; |
57 | 61 | ||
58 | use_these_perms: | 62 | use_these_perms: |
63 | |||
59 | /* 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 |
60 | * - possessor permissions are additive with other permissions | 65 | * - possessor permissions are additive with other permissions |
61 | */ | 66 | */ |
@@ -68,7 +73,7 @@ use_these_perms: | |||
68 | return -EACCES; | 73 | return -EACCES; |
69 | 74 | ||
70 | /* let LSM be the final arbiter */ | 75 | /* let LSM be the final arbiter */ |
71 | return security_key_permission(key_ref, context, perm); | 76 | return security_key_permission(key_ref, cred, perm); |
72 | 77 | ||
73 | } /* end key_task_permission() */ | 78 | } /* end key_task_permission() */ |
74 | 79 | ||