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