diff options
Diffstat (limited to 'security/keys/request_key_auth.c')
-rw-r--r-- | security/keys/request_key_auth.c | 41 |
1 files changed, 20 insertions, 21 deletions
diff --git a/security/keys/request_key_auth.c b/security/keys/request_key_auth.c index 2125579d5d73..86747151ee5b 100644 --- a/security/keys/request_key_auth.c +++ b/security/keys/request_key_auth.c | |||
@@ -105,9 +105,9 @@ static void request_key_auth_revoke(struct key *key) | |||
105 | 105 | ||
106 | kenter("{%d}", key->serial); | 106 | kenter("{%d}", key->serial); |
107 | 107 | ||
108 | if (rka->context) { | 108 | if (rka->cred) { |
109 | put_task_struct(rka->context); | 109 | put_cred(rka->cred); |
110 | rka->context = NULL; | 110 | rka->cred = NULL; |
111 | } | 111 | } |
112 | 112 | ||
113 | } /* end request_key_auth_revoke() */ | 113 | } /* end request_key_auth_revoke() */ |
@@ -122,9 +122,9 @@ static void request_key_auth_destroy(struct key *key) | |||
122 | 122 | ||
123 | kenter("{%d}", key->serial); | 123 | kenter("{%d}", key->serial); |
124 | 124 | ||
125 | if (rka->context) { | 125 | if (rka->cred) { |
126 | put_task_struct(rka->context); | 126 | put_cred(rka->cred); |
127 | rka->context = NULL; | 127 | rka->cred = NULL; |
128 | } | 128 | } |
129 | 129 | ||
130 | key_put(rka->target_key); | 130 | key_put(rka->target_key); |
@@ -143,6 +143,7 @@ struct key *request_key_auth_new(struct key *target, const void *callout_info, | |||
143 | size_t callout_len, struct key *dest_keyring) | 143 | size_t callout_len, struct key *dest_keyring) |
144 | { | 144 | { |
145 | struct request_key_auth *rka, *irka; | 145 | struct request_key_auth *rka, *irka; |
146 | const struct cred *cred = current->cred; | ||
146 | struct key *authkey = NULL; | 147 | struct key *authkey = NULL; |
147 | char desc[20]; | 148 | char desc[20]; |
148 | int ret; | 149 | int ret; |
@@ -164,28 +165,25 @@ struct key *request_key_auth_new(struct key *target, const void *callout_info, | |||
164 | 165 | ||
165 | /* see if the calling process is already servicing the key request of | 166 | /* see if the calling process is already servicing the key request of |
166 | * another process */ | 167 | * another process */ |
167 | if (current->cred->request_key_auth) { | 168 | if (cred->request_key_auth) { |
168 | /* it is - use that instantiation context here too */ | 169 | /* it is - use that instantiation context here too */ |
169 | down_read(¤t->cred->request_key_auth->sem); | 170 | down_read(&cred->request_key_auth->sem); |
170 | 171 | ||
171 | /* if the auth key has been revoked, then the key we're | 172 | /* if the auth key has been revoked, then the key we're |
172 | * servicing is already instantiated */ | 173 | * servicing is already instantiated */ |
173 | if (test_bit(KEY_FLAG_REVOKED, | 174 | if (test_bit(KEY_FLAG_REVOKED, &cred->request_key_auth->flags)) |
174 | ¤t->cred->request_key_auth->flags)) | ||
175 | goto auth_key_revoked; | 175 | goto auth_key_revoked; |
176 | 176 | ||
177 | irka = current->cred->request_key_auth->payload.data; | 177 | irka = cred->request_key_auth->payload.data; |
178 | rka->context = irka->context; | 178 | rka->cred = get_cred(irka->cred); |
179 | rka->pid = irka->pid; | 179 | rka->pid = irka->pid; |
180 | get_task_struct(rka->context); | ||
181 | 180 | ||
182 | up_read(¤t->cred->request_key_auth->sem); | 181 | up_read(&cred->request_key_auth->sem); |
183 | } | 182 | } |
184 | else { | 183 | else { |
185 | /* it isn't - use this process as the context */ | 184 | /* it isn't - use this process as the context */ |
186 | rka->context = current; | 185 | rka->cred = get_cred(cred); |
187 | rka->pid = current->pid; | 186 | rka->pid = current->pid; |
188 | get_task_struct(rka->context); | ||
189 | } | 187 | } |
190 | 188 | ||
191 | rka->target_key = key_get(target); | 189 | rka->target_key = key_get(target); |
@@ -197,7 +195,7 @@ struct key *request_key_auth_new(struct key *target, const void *callout_info, | |||
197 | sprintf(desc, "%x", target->serial); | 195 | sprintf(desc, "%x", target->serial); |
198 | 196 | ||
199 | authkey = key_alloc(&key_type_request_key_auth, desc, | 197 | authkey = key_alloc(&key_type_request_key_auth, desc, |
200 | current_fsuid(), current_fsgid(), current, | 198 | cred->fsuid, cred->fsgid, cred, |
201 | KEY_POS_VIEW | KEY_POS_READ | KEY_POS_SEARCH | | 199 | KEY_POS_VIEW | KEY_POS_READ | KEY_POS_SEARCH | |
202 | KEY_USR_VIEW, KEY_ALLOC_NOT_IN_QUOTA); | 200 | KEY_USR_VIEW, KEY_ALLOC_NOT_IN_QUOTA); |
203 | if (IS_ERR(authkey)) { | 201 | if (IS_ERR(authkey)) { |
@@ -205,16 +203,16 @@ struct key *request_key_auth_new(struct key *target, const void *callout_info, | |||
205 | goto error_alloc; | 203 | goto error_alloc; |
206 | } | 204 | } |
207 | 205 | ||
208 | /* construct and attach to the keyring */ | 206 | /* construct the auth key */ |
209 | ret = key_instantiate_and_link(authkey, rka, 0, NULL, NULL); | 207 | ret = key_instantiate_and_link(authkey, rka, 0, NULL, NULL); |
210 | if (ret < 0) | 208 | if (ret < 0) |
211 | goto error_inst; | 209 | goto error_inst; |
212 | 210 | ||
213 | kleave(" = {%d}", authkey->serial); | 211 | kleave(" = {%d,%d}", authkey->serial, atomic_read(&authkey->usage)); |
214 | return authkey; | 212 | return authkey; |
215 | 213 | ||
216 | auth_key_revoked: | 214 | auth_key_revoked: |
217 | up_read(¤t->cred->request_key_auth->sem); | 215 | up_read(&cred->request_key_auth->sem); |
218 | kfree(rka->callout_info); | 216 | kfree(rka->callout_info); |
219 | kfree(rka); | 217 | kfree(rka); |
220 | kleave("= -EKEYREVOKED"); | 218 | kleave("= -EKEYREVOKED"); |
@@ -257,6 +255,7 @@ static int key_get_instantiation_authkey_match(const struct key *key, | |||
257 | */ | 255 | */ |
258 | struct key *key_get_instantiation_authkey(key_serial_t target_id) | 256 | struct key *key_get_instantiation_authkey(key_serial_t target_id) |
259 | { | 257 | { |
258 | const struct cred *cred = current_cred(); | ||
260 | struct key *authkey; | 259 | struct key *authkey; |
261 | key_ref_t authkey_ref; | 260 | key_ref_t authkey_ref; |
262 | 261 | ||
@@ -264,7 +263,7 @@ struct key *key_get_instantiation_authkey(key_serial_t target_id) | |||
264 | &key_type_request_key_auth, | 263 | &key_type_request_key_auth, |
265 | (void *) (unsigned long) target_id, | 264 | (void *) (unsigned long) target_id, |
266 | key_get_instantiation_authkey_match, | 265 | key_get_instantiation_authkey_match, |
267 | current); | 266 | cred); |
268 | 267 | ||
269 | if (IS_ERR(authkey_ref)) { | 268 | if (IS_ERR(authkey_ref)) { |
270 | authkey = ERR_CAST(authkey_ref); | 269 | authkey = ERR_CAST(authkey_ref); |