2 * Copyright 2000, International Business Machines Corporation and others.
5 * This software has been released under the terms of the IBM Public
6 * License. For details, see the LICENSE file in the top-level source
7 * directory or online at http://www.openafs.org/dl/license10.html
11 * osi_cred.c - Linux cred handling routines.
14 #include <afsconfig.h>
15 #include "afs/param.h"
18 #include "afs/sysincludes.h"
19 #include "afsincludes.h"
21 /* Copy one credential structure to another, being careful about references */
23 afs_copy_creds(cred_t
*to_cred
, const cred_t
*from_cred
) {
24 #if defined(STRUCT_TASK_STRUCT_HAS_CRED)
25 /* Skip afs_from_kuid/afs_make_kuid round trip */
26 to_cred
->fsuid
= from_cred
->fsuid
;
27 to_cred
->fsgid
= from_cred
->fsgid
;
28 to_cred
->uid
= from_cred
->uid
;
29 to_cred
->gid
= from_cred
->gid
;
31 afs_set_cr_uid(to_cred
, afs_cr_uid(from_cred
));
32 afs_set_cr_gid(to_cred
, afs_cr_gid(from_cred
));
33 afs_set_cr_ruid(to_cred
, afs_cr_ruid(from_cred
));
34 afs_set_cr_rgid(to_cred
, afs_cr_rgid(from_cred
));
36 get_group_info(afs_cr_group_info(from_cred
));
37 afs_set_cr_group_info(to_cred
, afs_cr_group_info(from_cred
));
45 tmp
= kmalloc(sizeof(cred_t
), GFP_NOFS
);
47 osi_Panic("crget: No more memory for creds!\n");
49 #if defined(STRUCT_TASK_STRUCT_HAS_CRED)
52 atomic_set(&tmp
->cr_ref
, 1);
60 #if defined(STRUCT_TASK_STRUCT_HAS_CRED)
63 if (atomic_dec_and_test(&cr
->cr_ref
)) {
64 put_group_info(afs_cr_group_info(cr
));
71 /* Return a duplicate of the cred. */
75 cred_t
*tmp
= crget();
76 #if defined(STRUCT_TASK_STRUCT_HAS_CRED)
77 afs_copy_creds(tmp
, cr
);
79 afs_set_cr_uid(tmp
, afs_cr_uid(cr
));
80 afs_set_cr_ruid(tmp
, afs_cr_ruid(cr
));
81 afs_set_cr_gid(tmp
, afs_cr_gid(cr
));
82 afs_set_cr_rgid(tmp
, afs_cr_rgid(cr
));
84 get_group_info(afs_cr_group_info(cr
));
85 afs_set_cr_group_info(tmp
, afs_cr_group_info(cr
));
93 #if defined(STRUCT_TASK_STRUCT_HAS_CRED)
94 return (cred_t
*)get_current_cred();
98 afs_set_cr_uid(cr
, current_fsuid());
99 afs_set_cr_ruid(cr
, current_uid());
100 afs_set_cr_gid(cr
, current_fsgid());
101 afs_set_cr_rgid(cr
, current_gid());
104 get_group_info(current_group_info());
105 afs_set_cr_group_info(cr
, current_group_info());
106 task_unlock(current
);
112 /* Set the cred info into the current task */
116 #if defined(STRUCT_TASK_STRUCT_HAS_CRED)
117 struct cred
*new_creds
;
119 /* If our current task doesn't have identical real and effective
120 * credentials, commit_cred won't let us change them, so we just
123 if (current
->cred
!= current
->real_cred
)
125 new_creds
= prepare_creds();
126 /* Drop the reference to group_info - we'll overwrite it in afs_copy_creds */
127 put_group_info(new_creds
->group_info
);
128 afs_copy_creds(new_creds
, cr
);
130 commit_creds(new_creds
);
132 struct group_info
*old_info
;
134 current
->fsuid
= afs_cr_uid(cr
);
135 current
->uid
= afs_cr_ruid(cr
);
136 current
->fsgid
= afs_cr_gid(cr
);
137 current
->gid
= afs_cr_rgid(cr
);
139 get_group_info(afs_cr_group_info(cr
));
141 old_info
= current
->group_info
;
142 current
->group_info
= afs_cr_group_info(cr
);
143 task_unlock(current
);
144 put_group_info(old_info
);