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