Merge tag 'v3.10.108' into update
[GitHub/mt8127/android_kernel_alcatel_ttab.git] / security / keys / process_keys.c
CommitLineData
973c9f4f 1/* Manage a process's keyrings
1da177e4 2 *
69664cf1 3 * Copyright (C) 2004-2005, 2008 Red Hat, Inc. All Rights Reserved.
1da177e4
LT
4 * Written by David Howells (dhowells@redhat.com)
5 *
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License
8 * as published by the Free Software Foundation; either version
9 * 2 of the License, or (at your option) any later version.
10 */
11
12#include <linux/module.h>
13#include <linux/init.h>
14#include <linux/sched.h>
1da177e4
LT
15#include <linux/keyctl.h>
16#include <linux/fs.h>
17#include <linux/err.h>
bb003079 18#include <linux/mutex.h>
ee18d64c 19#include <linux/security.h>
1d1e9756 20#include <linux/user_namespace.h>
1da177e4
LT
21#include <asm/uaccess.h>
22#include "internal.h"
23
973c9f4f 24/* Session keyring create vs join semaphore */
bb003079 25static DEFINE_MUTEX(key_session_mutex);
1da177e4 26
973c9f4f 27/* User keyring creation semaphore */
69664cf1
DH
28static DEFINE_MUTEX(key_user_keyring_mutex);
29
973c9f4f 30/* The root user's tracking struct */
1da177e4
LT
31struct key_user root_key_user = {
32 .usage = ATOMIC_INIT(3),
76181c13 33 .cons_lock = __MUTEX_INITIALIZER(root_key_user.cons_lock),
6cfd76a2 34 .lock = __SPIN_LOCK_UNLOCKED(root_key_user.lock),
1da177e4
LT
35 .nkeys = ATOMIC_INIT(2),
36 .nikeys = ATOMIC_INIT(2),
9a56c2db 37 .uid = GLOBAL_ROOT_UID,
1da177e4
LT
38};
39
1da177e4 40/*
973c9f4f 41 * Install the user and user session keyrings for the current process's UID.
1da177e4 42 */
8bbf4976 43int install_user_keyrings(void)
1da177e4 44{
d84f4f99
DH
45 struct user_struct *user;
46 const struct cred *cred;
1da177e4 47 struct key *uid_keyring, *session_keyring;
96b5c8fe 48 key_perm_t user_keyring_perm;
1da177e4
LT
49 char buf[20];
50 int ret;
9a56c2db 51 uid_t uid;
1da177e4 52
96b5c8fe 53 user_keyring_perm = (KEY_POS_ALL & ~KEY_POS_SETATTR) | KEY_USR_ALL;
d84f4f99
DH
54 cred = current_cred();
55 user = cred->user;
9a56c2db 56 uid = from_kuid(cred->user_ns, user->uid);
d84f4f99 57
9a56c2db 58 kenter("%p{%u}", user, uid);
1da177e4 59
0da9dfdd 60 if (user->uid_keyring && user->session_keyring) {
69664cf1
DH
61 kleave(" = 0 [exist]");
62 return 0;
1da177e4
LT
63 }
64
69664cf1
DH
65 mutex_lock(&key_user_keyring_mutex);
66 ret = 0;
1da177e4 67
69664cf1
DH
68 if (!user->uid_keyring) {
69 /* get the UID-specific keyring
70 * - there may be one in existence already as it may have been
71 * pinned by a session, but the user_struct pointing to it
72 * may have been destroyed by setuid */
9a56c2db 73 sprintf(buf, "_uid.%u", uid);
69664cf1
DH
74
75 uid_keyring = find_keyring_by_name(buf, true);
76 if (IS_ERR(uid_keyring)) {
9a56c2db 77 uid_keyring = keyring_alloc(buf, user->uid, INVALID_GID,
96b5c8fe 78 cred, user_keyring_perm,
e8705c42
EB
79 KEY_ALLOC_UID_KEYRING |
80 KEY_ALLOC_IN_QUOTA,
81 NULL);
69664cf1
DH
82 if (IS_ERR(uid_keyring)) {
83 ret = PTR_ERR(uid_keyring);
84 goto error;
85 }
86 }
87
88 /* get a default session keyring (which might also exist
89 * already) */
9a56c2db 90 sprintf(buf, "_uid_ses.%u", uid);
69664cf1
DH
91
92 session_keyring = find_keyring_by_name(buf, true);
93 if (IS_ERR(session_keyring)) {
94 session_keyring =
9a56c2db 95 keyring_alloc(buf, user->uid, INVALID_GID,
96b5c8fe 96 cred, user_keyring_perm,
e8705c42
EB
97 KEY_ALLOC_UID_KEYRING |
98 KEY_ALLOC_IN_QUOTA,
99 NULL);
69664cf1
DH
100 if (IS_ERR(session_keyring)) {
101 ret = PTR_ERR(session_keyring);
102 goto error_release;
103 }
104
105 /* we install a link from the user session keyring to
106 * the user keyring */
107 ret = key_link(session_keyring, uid_keyring);
108 if (ret < 0)
109 goto error_release_both;
110 }
111
112 /* install the keyrings */
113 user->uid_keyring = uid_keyring;
114 user->session_keyring = session_keyring;
1da177e4
LT
115 }
116
69664cf1
DH
117 mutex_unlock(&key_user_keyring_mutex);
118 kleave(" = 0");
119 return 0;
1da177e4 120
69664cf1
DH
121error_release_both:
122 key_put(session_keyring);
123error_release:
124 key_put(uid_keyring);
664cceb0 125error:
69664cf1
DH
126 mutex_unlock(&key_user_keyring_mutex);
127 kleave(" = %d", ret);
1da177e4 128 return ret;
69664cf1 129}
1da177e4 130
1da177e4 131/*
d19182e2
EB
132 * Install a thread keyring to the given credentials struct if it didn't have
133 * one already. This is allowed to overrun the quota.
134 *
135 * Return: 0 if a thread keyring is now present; -errno on failure.
1da177e4 136 */
d84f4f99 137int install_thread_keyring_to_cred(struct cred *new)
1da177e4 138{
d84f4f99 139 struct key *keyring;
1da177e4 140
d19182e2
EB
141 if (new->thread_keyring)
142 return 0;
143
d84f4f99 144 keyring = keyring_alloc("_tid", new->uid, new->gid, new,
96b5c8fe 145 KEY_POS_ALL | KEY_USR_VIEW,
d84f4f99
DH
146 KEY_ALLOC_QUOTA_OVERRUN, NULL);
147 if (IS_ERR(keyring))
148 return PTR_ERR(keyring);
1da177e4 149
d84f4f99
DH
150 new->thread_keyring = keyring;
151 return 0;
152}
1da177e4 153
1da177e4 154/*
d19182e2
EB
155 * Install a thread keyring to the current task if it didn't have one already.
156 *
157 * Return: 0 if a thread keyring is now present; -errno on failure.
1da177e4 158 */
d84f4f99 159static int install_thread_keyring(void)
1da177e4 160{
d84f4f99 161 struct cred *new;
1da177e4
LT
162 int ret;
163
d84f4f99
DH
164 new = prepare_creds();
165 if (!new)
166 return -ENOMEM;
1da177e4 167
d84f4f99
DH
168 ret = install_thread_keyring_to_cred(new);
169 if (ret < 0) {
170 abort_creds(new);
171 return ret;
1da177e4
LT
172 }
173
d84f4f99
DH
174 return commit_creds(new);
175}
1da177e4 176
d84f4f99 177/*
d19182e2
EB
178 * Install a process keyring to the given credentials struct if it didn't have
179 * one already. This is allowed to overrun the quota.
973c9f4f 180 *
d19182e2 181 * Return: 0 if a process keyring is now present; -errno on failure.
d84f4f99
DH
182 */
183int install_process_keyring_to_cred(struct cred *new)
184{
185 struct key *keyring;
1da177e4 186
3a50597d 187 if (new->process_keyring)
d19182e2 188 return 0;
d84f4f99 189
96b5c8fe
DH
190 keyring = keyring_alloc("_pid", new->uid, new->gid, new,
191 KEY_POS_ALL | KEY_USR_VIEW,
192 KEY_ALLOC_QUOTA_OVERRUN, NULL);
d84f4f99
DH
193 if (IS_ERR(keyring))
194 return PTR_ERR(keyring);
195
3a50597d
DH
196 new->process_keyring = keyring;
197 return 0;
d84f4f99 198}
1da177e4 199
1da177e4 200/*
d19182e2 201 * Install a process keyring to the current task if it didn't have one already.
973c9f4f 202 *
d19182e2 203 * Return: 0 if a process keyring is now present; -errno on failure.
1da177e4 204 */
d84f4f99 205static int install_process_keyring(void)
1da177e4 206{
d84f4f99 207 struct cred *new;
1da177e4
LT
208 int ret;
209
d84f4f99
DH
210 new = prepare_creds();
211 if (!new)
212 return -ENOMEM;
1da177e4 213
d84f4f99
DH
214 ret = install_process_keyring_to_cred(new);
215 if (ret < 0) {
216 abort_creds(new);
d19182e2 217 return ret;
1da177e4
LT
218 }
219
d84f4f99
DH
220 return commit_creds(new);
221}
1da177e4 222
1da177e4 223/*
d19182e2
EB
224 * Install the given keyring as the session keyring of the given credentials
225 * struct, replacing the existing one if any. If the given keyring is NULL,
226 * then install a new anonymous session keyring.
227 *
228 * Return: 0 on success; -errno on failure.
1da177e4 229 */
685bfd2c 230int install_session_keyring_to_cred(struct cred *cred, struct key *keyring)
1da177e4 231{
7e047ef5 232 unsigned long flags;
1da177e4 233 struct key *old;
1a26feb9
DH
234
235 might_sleep();
1da177e4
LT
236
237 /* create an empty session keyring */
238 if (!keyring) {
7e047ef5 239 flags = KEY_ALLOC_QUOTA_OVERRUN;
3a50597d 240 if (cred->session_keyring)
7e047ef5
DH
241 flags = KEY_ALLOC_IN_QUOTA;
242
96b5c8fe
DH
243 keyring = keyring_alloc("_ses", cred->uid, cred->gid, cred,
244 KEY_POS_ALL | KEY_USR_VIEW | KEY_USR_READ,
245 flags, NULL);
1a26feb9
DH
246 if (IS_ERR(keyring))
247 return PTR_ERR(keyring);
d84f4f99 248 } else {
1da177e4
LT
249 atomic_inc(&keyring->usage);
250 }
251
252 /* install the keyring */
3a50597d
DH
253 old = cred->session_keyring;
254 rcu_assign_pointer(cred->session_keyring, keyring);
255
256 if (old)
1a26feb9 257 key_put(old);
1da177e4 258
1a26feb9 259 return 0;
d84f4f99 260}
1da177e4 261
1da177e4 262/*
d19182e2
EB
263 * Install the given keyring as the session keyring of the current task,
264 * replacing the existing one if any. If the given keyring is NULL, then
265 * install a new anonymous session keyring.
266 *
267 * Return: 0 on success; -errno on failure.
1da177e4 268 */
d84f4f99 269static int install_session_keyring(struct key *keyring)
1da177e4 270{
d84f4f99
DH
271 struct cred *new;
272 int ret;
1da177e4 273
d84f4f99
DH
274 new = prepare_creds();
275 if (!new)
276 return -ENOMEM;
1da177e4 277
99599537 278 ret = install_session_keyring_to_cred(new, keyring);
d84f4f99
DH
279 if (ret < 0) {
280 abort_creds(new);
281 return ret;
282 }
1da177e4 283
d84f4f99
DH
284 return commit_creds(new);
285}
1da177e4 286
1da177e4 287/*
973c9f4f 288 * Handle the fsuid changing.
1da177e4
LT
289 */
290void key_fsuid_changed(struct task_struct *tsk)
291{
292 /* update the ownership of the thread keyring */
b6dff3ec
DH
293 BUG_ON(!tsk->cred);
294 if (tsk->cred->thread_keyring) {
295 down_write(&tsk->cred->thread_keyring->sem);
296 tsk->cred->thread_keyring->uid = tsk->cred->fsuid;
297 up_write(&tsk->cred->thread_keyring->sem);
1da177e4 298 }
a8b17ed0 299}
1da177e4 300
1da177e4 301/*
973c9f4f 302 * Handle the fsgid changing.
1da177e4
LT
303 */
304void key_fsgid_changed(struct task_struct *tsk)
305{
306 /* update the ownership of the thread keyring */
b6dff3ec
DH
307 BUG_ON(!tsk->cred);
308 if (tsk->cred->thread_keyring) {
309 down_write(&tsk->cred->thread_keyring->sem);
310 tsk->cred->thread_keyring->gid = tsk->cred->fsgid;
311 up_write(&tsk->cred->thread_keyring->sem);
1da177e4 312 }
a8b17ed0 313}
1da177e4 314
1da177e4 315/*
973c9f4f
DH
316 * Search the process keyrings attached to the supplied cred for the first
317 * matching key.
318 *
319 * The search criteria are the type and the match function. The description is
320 * given to the match function as a parameter, but doesn't otherwise influence
321 * the search. Typically the match function will compare the description
322 * parameter to the key's description.
323 *
324 * This can only search keyrings that grant Search permission to the supplied
325 * credentials. Keyrings linked to searched keyrings will also be searched if
326 * they grant Search permission too. Keys can only be found if they grant
327 * Search permission to the credentials.
328 *
329 * Returns a pointer to the key with the key usage count incremented if
330 * successful, -EAGAIN if we didn't find any matching key or -ENOKEY if we only
331 * matched negative keys.
332 *
333 * In the case of a successful return, the possession attribute is set on the
334 * returned key reference.
1da177e4 335 */
927942aa
DH
336key_ref_t search_my_process_keyrings(struct key_type *type,
337 const void *description,
338 key_match_func_t match,
78b7280c 339 bool no_state_check,
927942aa 340 const struct cred *cred)
1da177e4 341{
b5f545c8 342 key_ref_t key_ref, ret, err;
1da177e4
LT
343
344 /* we want to return -EAGAIN or -ENOKEY if any of the keyrings were
345 * searchable, but we failed to find a key or we found a negative key;
346 * otherwise we want to return a sample error (probably -EACCES) if
347 * none of the keyrings were searchable
348 *
349 * in terms of priority: success > -ENOKEY > -EAGAIN > other error
350 */
664cceb0 351 key_ref = NULL;
1da177e4
LT
352 ret = NULL;
353 err = ERR_PTR(-EAGAIN);
354
355 /* search the thread keyring first */
c69e8d9c 356 if (cred->thread_keyring) {
664cceb0 357 key_ref = keyring_search_aux(
c69e8d9c 358 make_key_ref(cred->thread_keyring, 1),
78b7280c 359 cred, type, description, match, no_state_check);
664cceb0 360 if (!IS_ERR(key_ref))
1da177e4
LT
361 goto found;
362
664cceb0 363 switch (PTR_ERR(key_ref)) {
1da177e4 364 case -EAGAIN: /* no key */
1da177e4 365 case -ENOKEY: /* negative key */
664cceb0 366 ret = key_ref;
1da177e4
LT
367 break;
368 default:
664cceb0 369 err = key_ref;
1da177e4
LT
370 break;
371 }
372 }
373
374 /* search the process keyring second */
3a50597d 375 if (cred->process_keyring) {
664cceb0 376 key_ref = keyring_search_aux(
3a50597d 377 make_key_ref(cred->process_keyring, 1),
78b7280c 378 cred, type, description, match, no_state_check);
664cceb0 379 if (!IS_ERR(key_ref))
1da177e4
LT
380 goto found;
381
664cceb0 382 switch (PTR_ERR(key_ref)) {
1da177e4 383 case -EAGAIN: /* no key */
fe9453a1
DH
384 if (ret)
385 break;
1da177e4 386 case -ENOKEY: /* negative key */
664cceb0 387 ret = key_ref;
1da177e4
LT
388 break;
389 default:
664cceb0 390 err = key_ref;
1da177e4
LT
391 break;
392 }
393 }
394
3e30148c 395 /* search the session keyring */
3a50597d 396 if (cred->session_keyring) {
8589b4e0 397 rcu_read_lock();
664cceb0 398 key_ref = keyring_search_aux(
3a50597d 399 make_key_ref(rcu_dereference(cred->session_keyring), 1),
78b7280c 400 cred, type, description, match, no_state_check);
8589b4e0 401 rcu_read_unlock();
3e30148c 402
664cceb0 403 if (!IS_ERR(key_ref))
3e30148c
DH
404 goto found;
405
664cceb0 406 switch (PTR_ERR(key_ref)) {
3e30148c
DH
407 case -EAGAIN: /* no key */
408 if (ret)
409 break;
410 case -ENOKEY: /* negative key */
664cceb0 411 ret = key_ref;
3e30148c
DH
412 break;
413 default:
664cceb0 414 err = key_ref;
3e30148c
DH
415 break;
416 }
b5f545c8
DH
417 }
418 /* or search the user-session keyring */
c69e8d9c 419 else if (cred->user->session_keyring) {
b5f545c8 420 key_ref = keyring_search_aux(
c69e8d9c 421 make_key_ref(cred->user->session_keyring, 1),
78b7280c 422 cred, type, description, match, no_state_check);
664cceb0 423 if (!IS_ERR(key_ref))
3e30148c
DH
424 goto found;
425
664cceb0 426 switch (PTR_ERR(key_ref)) {
3e30148c
DH
427 case -EAGAIN: /* no key */
428 if (ret)
429 break;
430 case -ENOKEY: /* negative key */
664cceb0 431 ret = key_ref;
3e30148c
DH
432 break;
433 default:
664cceb0 434 err = key_ref;
3e30148c
DH
435 break;
436 }
8589b4e0 437 }
b5f545c8 438
927942aa
DH
439 /* no key - decide on the error we're going to go for */
440 key_ref = ret ? ret : err;
441
442found:
443 return key_ref;
444}
445
927942aa 446/*
973c9f4f
DH
447 * Search the process keyrings attached to the supplied cred for the first
448 * matching key in the manner of search_my_process_keyrings(), but also search
449 * the keys attached to the assumed authorisation key using its credentials if
450 * one is available.
451 *
452 * Return same as search_my_process_keyrings().
927942aa
DH
453 */
454key_ref_t search_process_keyrings(struct key_type *type,
455 const void *description,
456 key_match_func_t match,
457 const struct cred *cred)
458{
459 struct request_key_auth *rka;
460 key_ref_t key_ref, ret = ERR_PTR(-EACCES), err;
461
462 might_sleep();
463
78b7280c
DH
464 key_ref = search_my_process_keyrings(type, description, match,
465 false, cred);
927942aa
DH
466 if (!IS_ERR(key_ref))
467 goto found;
468 err = key_ref;
469
b5f545c8
DH
470 /* if this process has an instantiation authorisation key, then we also
471 * search the keyrings of the process mentioned there
472 * - we don't permit access to request_key auth keys via this method
473 */
c69e8d9c 474 if (cred->request_key_auth &&
d84f4f99 475 cred == current_cred() &&
04c567d9 476 type != &key_type_request_key_auth
b5f545c8 477 ) {
04c567d9 478 /* defend against the auth key being revoked */
c69e8d9c 479 down_read(&cred->request_key_auth->sem);
b5f545c8 480
c69e8d9c
DH
481 if (key_validate(cred->request_key_auth) == 0) {
482 rka = cred->request_key_auth->payload.data;
b5f545c8 483
04c567d9 484 key_ref = search_process_keyrings(type, description,
d84f4f99 485 match, rka->cred);
1da177e4 486
c69e8d9c 487 up_read(&cred->request_key_auth->sem);
04c567d9
DH
488
489 if (!IS_ERR(key_ref))
490 goto found;
491
927942aa 492 ret = key_ref;
04c567d9 493 } else {
c69e8d9c 494 up_read(&cred->request_key_auth->sem);
3e30148c 495 }
1da177e4
LT
496 }
497
498 /* no key - decide on the error we're going to go for */
927942aa
DH
499 if (err == ERR_PTR(-ENOKEY) || ret == ERR_PTR(-ENOKEY))
500 key_ref = ERR_PTR(-ENOKEY);
501 else if (err == ERR_PTR(-EACCES))
502 key_ref = ret;
503 else
504 key_ref = err;
1da177e4 505
3e30148c 506found:
664cceb0 507 return key_ref;
a8b17ed0 508}
1da177e4 509
664cceb0 510/*
973c9f4f 511 * See if the key we're looking at is the target key.
664cceb0 512 */
927942aa 513int lookup_user_key_possessed(const struct key *key, const void *target)
664cceb0
DH
514{
515 return key == target;
a8b17ed0 516}
664cceb0 517
1da177e4 518/*
973c9f4f
DH
519 * Look up a key ID given us by userspace with a given permissions mask to get
520 * the key it refers to.
521 *
522 * Flags can be passed to request that special keyrings be created if referred
523 * to directly, to permit partially constructed keys to be found and to skip
524 * validity and permission checks on the found key.
525 *
526 * Returns a pointer to the key with an incremented usage count if successful;
527 * -EINVAL if the key ID is invalid; -ENOKEY if the key ID does not correspond
528 * to a key or the best found key was a negative key; -EKEYREVOKED or
529 * -EKEYEXPIRED if the best found key was revoked or expired; -EACCES if the
530 * found key doesn't grant the requested permit or the LSM denied access to it;
531 * or -ENOMEM if a special keyring couldn't be created.
532 *
533 * In the case of a successful return, the possession attribute is set on the
534 * returned key reference.
1da177e4 535 */
5593122e 536key_ref_t lookup_user_key(key_serial_t id, unsigned long lflags,
8bbf4976 537 key_perm_t perm)
1da177e4 538{
8bbf4976 539 struct request_key_auth *rka;
d84f4f99 540 const struct cred *cred;
1da177e4 541 struct key *key;
b6dff3ec 542 key_ref_t key_ref, skey_ref;
1da177e4
LT
543 int ret;
544
bb952bb9
DH
545try_again:
546 cred = get_current_cred();
664cceb0 547 key_ref = ERR_PTR(-ENOKEY);
1da177e4
LT
548
549 switch (id) {
550 case KEY_SPEC_THREAD_KEYRING:
b6dff3ec 551 if (!cred->thread_keyring) {
5593122e 552 if (!(lflags & KEY_LOOKUP_CREATE))
1da177e4
LT
553 goto error;
554
8bbf4976 555 ret = install_thread_keyring();
1da177e4 556 if (ret < 0) {
4d09ec0f 557 key_ref = ERR_PTR(ret);
1da177e4
LT
558 goto error;
559 }
bb952bb9 560 goto reget_creds;
1da177e4
LT
561 }
562
b6dff3ec 563 key = cred->thread_keyring;
1da177e4 564 atomic_inc(&key->usage);
664cceb0 565 key_ref = make_key_ref(key, 1);
1da177e4
LT
566 break;
567
568 case KEY_SPEC_PROCESS_KEYRING:
3a50597d 569 if (!cred->process_keyring) {
5593122e 570 if (!(lflags & KEY_LOOKUP_CREATE))
1da177e4
LT
571 goto error;
572
8bbf4976 573 ret = install_process_keyring();
1da177e4 574 if (ret < 0) {
4d09ec0f 575 key_ref = ERR_PTR(ret);
1da177e4
LT
576 goto error;
577 }
bb952bb9 578 goto reget_creds;
1da177e4
LT
579 }
580
3a50597d 581 key = cred->process_keyring;
1da177e4 582 atomic_inc(&key->usage);
664cceb0 583 key_ref = make_key_ref(key, 1);
1da177e4
LT
584 break;
585
586 case KEY_SPEC_SESSION_KEYRING:
3a50597d 587 if (!cred->session_keyring) {
1da177e4
LT
588 /* always install a session keyring upon access if one
589 * doesn't exist yet */
8bbf4976 590 ret = install_user_keyrings();
69664cf1
DH
591 if (ret < 0)
592 goto error;
3ecf1b4f
DH
593 if (lflags & KEY_LOOKUP_CREATE)
594 ret = join_session_keyring(NULL);
595 else
596 ret = install_session_keyring(
597 cred->user->session_keyring);
d84f4f99 598
1da177e4
LT
599 if (ret < 0)
600 goto error;
bb952bb9 601 goto reget_creds;
3a50597d 602 } else if (cred->session_keyring ==
3ecf1b4f
DH
603 cred->user->session_keyring &&
604 lflags & KEY_LOOKUP_CREATE) {
605 ret = join_session_keyring(NULL);
606 if (ret < 0)
607 goto error;
608 goto reget_creds;
1da177e4
LT
609 }
610
3e30148c 611 rcu_read_lock();
3a50597d 612 key = rcu_dereference(cred->session_keyring);
1da177e4 613 atomic_inc(&key->usage);
3e30148c 614 rcu_read_unlock();
664cceb0 615 key_ref = make_key_ref(key, 1);
1da177e4
LT
616 break;
617
618 case KEY_SPEC_USER_KEYRING:
b6dff3ec 619 if (!cred->user->uid_keyring) {
8bbf4976 620 ret = install_user_keyrings();
69664cf1
DH
621 if (ret < 0)
622 goto error;
623 }
624
b6dff3ec 625 key = cred->user->uid_keyring;
1da177e4 626 atomic_inc(&key->usage);
664cceb0 627 key_ref = make_key_ref(key, 1);
1da177e4
LT
628 break;
629
630 case KEY_SPEC_USER_SESSION_KEYRING:
b6dff3ec 631 if (!cred->user->session_keyring) {
8bbf4976 632 ret = install_user_keyrings();
69664cf1
DH
633 if (ret < 0)
634 goto error;
635 }
636
b6dff3ec 637 key = cred->user->session_keyring;
1da177e4 638 atomic_inc(&key->usage);
664cceb0 639 key_ref = make_key_ref(key, 1);
1da177e4
LT
640 break;
641
642 case KEY_SPEC_GROUP_KEYRING:
643 /* group keyrings are not yet supported */
4d09ec0f 644 key_ref = ERR_PTR(-EINVAL);
1da177e4
LT
645 goto error;
646
b5f545c8 647 case KEY_SPEC_REQKEY_AUTH_KEY:
b6dff3ec 648 key = cred->request_key_auth;
b5f545c8
DH
649 if (!key)
650 goto error;
651
652 atomic_inc(&key->usage);
653 key_ref = make_key_ref(key, 1);
654 break;
655
8bbf4976 656 case KEY_SPEC_REQUESTOR_KEYRING:
b6dff3ec 657 if (!cred->request_key_auth)
8bbf4976
DH
658 goto error;
659
b6dff3ec 660 down_read(&cred->request_key_auth->sem);
f67dabbd
DC
661 if (test_bit(KEY_FLAG_REVOKED,
662 &cred->request_key_auth->flags)) {
8bbf4976
DH
663 key_ref = ERR_PTR(-EKEYREVOKED);
664 key = NULL;
665 } else {
b6dff3ec 666 rka = cred->request_key_auth->payload.data;
8bbf4976
DH
667 key = rka->dest_keyring;
668 atomic_inc(&key->usage);
669 }
b6dff3ec 670 up_read(&cred->request_key_auth->sem);
8bbf4976
DH
671 if (!key)
672 goto error;
673 key_ref = make_key_ref(key, 1);
674 break;
675
1da177e4 676 default:
664cceb0 677 key_ref = ERR_PTR(-EINVAL);
1da177e4
LT
678 if (id < 1)
679 goto error;
680
681 key = key_lookup(id);
664cceb0 682 if (IS_ERR(key)) {
e231c2ee 683 key_ref = ERR_CAST(key);
1da177e4 684 goto error;
664cceb0
DH
685 }
686
687 key_ref = make_key_ref(key, 0);
688
689 /* check to see if we possess the key */
690 skey_ref = search_process_keyrings(key->type, key,
691 lookup_user_key_possessed,
d84f4f99 692 cred);
664cceb0
DH
693
694 if (!IS_ERR(skey_ref)) {
695 key_put(key);
696 key_ref = skey_ref;
697 }
698
1da177e4
LT
699 break;
700 }
701
5593122e
DH
702 /* unlink does not use the nominated key in any way, so can skip all
703 * the permission checks as it is only concerned with the keyring */
704 if (lflags & KEY_LOOKUP_FOR_UNLINK) {
705 ret = 0;
706 goto error;
707 }
708
709 if (!(lflags & KEY_LOOKUP_PARTIAL)) {
76181c13
DH
710 ret = wait_for_key_construction(key, true);
711 switch (ret) {
712 case -ERESTARTSYS:
713 goto invalid_key;
714 default:
715 if (perm)
716 goto invalid_key;
717 case 0:
718 break;
719 }
720 } else if (perm) {
1da177e4
LT
721 ret = key_validate(key);
722 if (ret < 0)
723 goto invalid_key;
724 }
725
726 ret = -EIO;
5593122e
DH
727 if (!(lflags & KEY_LOOKUP_PARTIAL) &&
728 !test_bit(KEY_FLAG_INSTANTIATED, &key->flags))
1da177e4
LT
729 goto invalid_key;
730
3e30148c 731 /* check the permissions */
d84f4f99 732 ret = key_task_permission(key_ref, cred, perm);
29db9190 733 if (ret < 0)
1da177e4
LT
734 goto invalid_key;
735
31d5a79d
DH
736 key->last_used_at = current_kernel_time().tv_sec;
737
664cceb0 738error:
bb952bb9 739 put_cred(cred);
664cceb0 740 return key_ref;
1da177e4 741
664cceb0
DH
742invalid_key:
743 key_ref_put(key_ref);
744 key_ref = ERR_PTR(ret);
1da177e4
LT
745 goto error;
746
bb952bb9
DH
747 /* if we attempted to install a keyring, then it may have caused new
748 * creds to be installed */
749reget_creds:
750 put_cred(cred);
751 goto try_again;
a8b17ed0 752}
bb952bb9 753
1da177e4 754/*
973c9f4f
DH
755 * Join the named keyring as the session keyring if possible else attempt to
756 * create a new one of that name and join that.
757 *
758 * If the name is NULL, an empty anonymous keyring will be installed as the
759 * session keyring.
760 *
761 * Named session keyrings are joined with a semaphore held to prevent the
762 * keyrings from going away whilst the attempt is made to going them and also
763 * to prevent a race in creating compatible session keyrings.
1da177e4
LT
764 */
765long join_session_keyring(const char *name)
766{
d84f4f99
DH
767 const struct cred *old;
768 struct cred *new;
1da177e4 769 struct key *keyring;
d84f4f99
DH
770 long ret, serial;
771
d84f4f99
DH
772 new = prepare_creds();
773 if (!new)
774 return -ENOMEM;
775 old = current_cred();
1da177e4
LT
776
777 /* if no name is provided, install an anonymous keyring */
778 if (!name) {
d84f4f99 779 ret = install_session_keyring_to_cred(new, NULL);
1da177e4
LT
780 if (ret < 0)
781 goto error;
782
3a50597d 783 serial = new->session_keyring->serial;
d84f4f99
DH
784 ret = commit_creds(new);
785 if (ret == 0)
786 ret = serial;
787 goto okay;
1da177e4
LT
788 }
789
790 /* allow the user to join or create a named keyring */
bb003079 791 mutex_lock(&key_session_mutex);
1da177e4
LT
792
793 /* look for an existing keyring of this name */
69664cf1 794 keyring = find_keyring_by_name(name, false);
1da177e4
LT
795 if (PTR_ERR(keyring) == -ENOKEY) {
796 /* not found - try and create a new one */
96b5c8fe
DH
797 keyring = keyring_alloc(
798 name, old->uid, old->gid, old,
799 KEY_POS_ALL | KEY_USR_VIEW | KEY_USR_READ | KEY_USR_LINK,
800 KEY_ALLOC_IN_QUOTA, NULL);
1da177e4
LT
801 if (IS_ERR(keyring)) {
802 ret = PTR_ERR(keyring);
bcf945d3 803 goto error2;
1da177e4 804 }
d84f4f99 805 } else if (IS_ERR(keyring)) {
1da177e4
LT
806 ret = PTR_ERR(keyring);
807 goto error2;
3a50597d 808 } else if (keyring == new->session_keyring) {
84de97ff 809 key_put(keyring);
3a50597d
DH
810 ret = 0;
811 goto error2;
1da177e4
LT
812 }
813
814 /* we've got a keyring - now to install it */
d84f4f99 815 ret = install_session_keyring_to_cred(new, keyring);
1da177e4
LT
816 if (ret < 0)
817 goto error2;
818
d84f4f99
DH
819 commit_creds(new);
820 mutex_unlock(&key_session_mutex);
821
1da177e4
LT
822 ret = keyring->serial;
823 key_put(keyring);
d84f4f99
DH
824okay:
825 return ret;
1da177e4 826
664cceb0 827error2:
bb003079 828 mutex_unlock(&key_session_mutex);
664cceb0 829error:
d84f4f99 830 abort_creds(new);
1da177e4 831 return ret;
d84f4f99 832}
ee18d64c
DH
833
834/*
973c9f4f
DH
835 * Replace a process's session keyring on behalf of one of its children when
836 * the target process is about to resume userspace execution.
ee18d64c 837 */
67d12145 838void key_change_session_keyring(struct callback_head *twork)
ee18d64c 839{
413cd3d9 840 const struct cred *old = current_cred();
67d12145 841 struct cred *new = container_of(twork, struct cred, rcu);
ee18d64c 842
413cd3d9
ON
843 if (unlikely(current->flags & PF_EXITING)) {
844 put_cred(new);
ee18d64c 845 return;
413cd3d9 846 }
ee18d64c 847
ee18d64c
DH
848 new-> uid = old-> uid;
849 new-> euid = old-> euid;
850 new-> suid = old-> suid;
851 new->fsuid = old->fsuid;
852 new-> gid = old-> gid;
853 new-> egid = old-> egid;
854 new-> sgid = old-> sgid;
855 new->fsgid = old->fsgid;
856 new->user = get_uid(old->user);
ba0e3427 857 new->user_ns = get_user_ns(old->user_ns);
ee18d64c
DH
858 new->group_info = get_group_info(old->group_info);
859
860 new->securebits = old->securebits;
861 new->cap_inheritable = old->cap_inheritable;
862 new->cap_permitted = old->cap_permitted;
863 new->cap_effective = old->cap_effective;
864 new->cap_bset = old->cap_bset;
865
866 new->jit_keyring = old->jit_keyring;
867 new->thread_keyring = key_get(old->thread_keyring);
3a50597d 868 new->process_keyring = key_get(old->process_keyring);
ee18d64c
DH
869
870 security_transfer_creds(new, old);
871
872 commit_creds(new);
873}