request_key.c (8bbf4976b59fc9fc2861e79cab7beb3f6d647640) request_key.c (b6dff3ec5e116e3af6f537d4caedcad6b9e5082a)
1/* Request a key from userspace
2 *
3 * Copyright (C) 2004-2007 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

--- 90 unchanged lines hidden (view full) ---

99 sprintf(uid_str, "%d", current_fsuid());
100 sprintf(gid_str, "%d", current_fsgid());
101
102 /* we say which key is under construction */
103 sprintf(key_str, "%d", key->serial);
104
105 /* we specify the process's default keyrings */
106 sprintf(keyring_str[0], "%d",
1/* Request a key from userspace
2 *
3 * Copyright (C) 2004-2007 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

--- 90 unchanged lines hidden (view full) ---

99 sprintf(uid_str, "%d", current_fsuid());
100 sprintf(gid_str, "%d", current_fsgid());
101
102 /* we say which key is under construction */
103 sprintf(key_str, "%d", key->serial);
104
105 /* we specify the process's default keyrings */
106 sprintf(keyring_str[0], "%d",
107 tsk->thread_keyring ? tsk->thread_keyring->serial : 0);
107 tsk->cred->thread_keyring ?
108 tsk->cred->thread_keyring->serial : 0);
108
109 prkey = 0;
110 if (tsk->signal->process_keyring)
111 prkey = tsk->signal->process_keyring->serial;
112
113 sprintf(keyring_str[1], "%d", prkey);
114
115 if (tsk->signal->session_keyring) {
116 rcu_read_lock();
117 sskey = rcu_dereference(tsk->signal->session_keyring)->serial;
118 rcu_read_unlock();
119 } else {
109
110 prkey = 0;
111 if (tsk->signal->process_keyring)
112 prkey = tsk->signal->process_keyring->serial;
113
114 sprintf(keyring_str[1], "%d", prkey);
115
116 if (tsk->signal->session_keyring) {
117 rcu_read_lock();
118 sskey = rcu_dereference(tsk->signal->session_keyring)->serial;
119 rcu_read_unlock();
120 } else {
120 sskey = tsk->user->session_keyring->serial;
121 sskey = tsk->cred->user->session_keyring->serial;
121 }
122
123 sprintf(keyring_str[2], "%d", sskey);
124
125 /* set up a minimal environment */
126 i = 0;
127 envp[i++] = "HOME=/";
128 envp[i++] = "PATH=/sbin:/bin:/usr/sbin:/usr/bin";

--- 98 unchanged lines hidden (view full) ---

227
228 /* find the appropriate keyring */
229 if (dest_keyring) {
230 /* the caller supplied one */
231 key_get(dest_keyring);
232 } else {
233 /* use a default keyring; falling through the cases until we
234 * find one that we actually have */
122 }
123
124 sprintf(keyring_str[2], "%d", sskey);
125
126 /* set up a minimal environment */
127 i = 0;
128 envp[i++] = "HOME=/";
129 envp[i++] = "PATH=/sbin:/bin:/usr/sbin:/usr/bin";

--- 98 unchanged lines hidden (view full) ---

228
229 /* find the appropriate keyring */
230 if (dest_keyring) {
231 /* the caller supplied one */
232 key_get(dest_keyring);
233 } else {
234 /* use a default keyring; falling through the cases until we
235 * find one that we actually have */
235 switch (tsk->jit_keyring) {
236 switch (tsk->cred->jit_keyring) {
236 case KEY_REQKEY_DEFL_DEFAULT:
237 case KEY_REQKEY_DEFL_REQUESTOR_KEYRING:
237 case KEY_REQKEY_DEFL_DEFAULT:
238 case KEY_REQKEY_DEFL_REQUESTOR_KEYRING:
238 if (tsk->request_key_auth) {
239 authkey = tsk->request_key_auth;
239 if (tsk->cred->request_key_auth) {
240 authkey = tsk->cred->request_key_auth;
240 down_read(&authkey->sem);
241 rka = authkey->payload.data;
242 if (!test_bit(KEY_FLAG_REVOKED,
243 &authkey->flags))
244 dest_keyring =
245 key_get(rka->dest_keyring);
246 up_read(&authkey->sem);
247 if (dest_keyring)
248 break;
249 }
250
251 case KEY_REQKEY_DEFL_THREAD_KEYRING:
241 down_read(&authkey->sem);
242 rka = authkey->payload.data;
243 if (!test_bit(KEY_FLAG_REVOKED,
244 &authkey->flags))
245 dest_keyring =
246 key_get(rka->dest_keyring);
247 up_read(&authkey->sem);
248 if (dest_keyring)
249 break;
250 }
251
252 case KEY_REQKEY_DEFL_THREAD_KEYRING:
252 dest_keyring = key_get(tsk->thread_keyring);
253 dest_keyring = key_get(tsk->cred->thread_keyring);
253 if (dest_keyring)
254 break;
255
256 case KEY_REQKEY_DEFL_PROCESS_KEYRING:
257 dest_keyring = key_get(tsk->signal->process_keyring);
258 if (dest_keyring)
259 break;
260
261 case KEY_REQKEY_DEFL_SESSION_KEYRING:
262 rcu_read_lock();
263 dest_keyring = key_get(
264 rcu_dereference(tsk->signal->session_keyring));
265 rcu_read_unlock();
266
267 if (dest_keyring)
268 break;
269
270 case KEY_REQKEY_DEFL_USER_SESSION_KEYRING:
254 if (dest_keyring)
255 break;
256
257 case KEY_REQKEY_DEFL_PROCESS_KEYRING:
258 dest_keyring = key_get(tsk->signal->process_keyring);
259 if (dest_keyring)
260 break;
261
262 case KEY_REQKEY_DEFL_SESSION_KEYRING:
263 rcu_read_lock();
264 dest_keyring = key_get(
265 rcu_dereference(tsk->signal->session_keyring));
266 rcu_read_unlock();
267
268 if (dest_keyring)
269 break;
270
271 case KEY_REQKEY_DEFL_USER_SESSION_KEYRING:
271 dest_keyring = key_get(tsk->user->session_keyring);
272 dest_keyring =
273 key_get(tsk->cred->user->session_keyring);
272 break;
273
274 case KEY_REQKEY_DEFL_USER_KEYRING:
274 break;
275
276 case KEY_REQKEY_DEFL_USER_KEYRING:
275 dest_keyring = key_get(tsk->user->uid_keyring);
277 dest_keyring = key_get(tsk->cred->user->uid_keyring);
276 break;
277
278 case KEY_REQKEY_DEFL_GROUP_KEYRING:
279 default:
280 BUG();
281 }
282 }
283

--- 267 unchanged lines hidden ---
278 break;
279
280 case KEY_REQKEY_DEFL_GROUP_KEYRING:
281 default:
282 BUG();
283 }
284 }
285

--- 267 unchanged lines hidden ---