diff options
Diffstat (limited to 'security/keys/request_key.c')
-rw-r--r-- | security/keys/request_key.c | 29 |
1 files changed, 18 insertions, 11 deletions
diff --git a/security/keys/request_key.c b/security/keys/request_key.c index 3d12558362df..0e04f72ef2d4 100644 --- a/security/keys/request_key.c +++ b/security/keys/request_key.c | |||
@@ -83,8 +83,10 @@ static int call_sbin_request_key(struct key_construction *cons, | |||
83 | /* allocate a new session keyring */ | 83 | /* allocate a new session keyring */ |
84 | sprintf(desc, "_req.%u", key->serial); | 84 | sprintf(desc, "_req.%u", key->serial); |
85 | 85 | ||
86 | keyring = keyring_alloc(desc, current_fsuid(), current_fsgid(), current, | 86 | cred = get_current_cred(); |
87 | keyring = keyring_alloc(desc, cred->fsuid, cred->fsgid, cred, | ||
87 | KEY_ALLOC_QUOTA_OVERRUN, NULL); | 88 | KEY_ALLOC_QUOTA_OVERRUN, NULL); |
89 | put_cred(cred); | ||
88 | if (IS_ERR(keyring)) { | 90 | if (IS_ERR(keyring)) { |
89 | ret = PTR_ERR(keyring); | 91 | ret = PTR_ERR(keyring); |
90 | goto error_alloc; | 92 | goto error_alloc; |
@@ -104,8 +106,7 @@ static int call_sbin_request_key(struct key_construction *cons, | |||
104 | 106 | ||
105 | /* we specify the process's default keyrings */ | 107 | /* we specify the process's default keyrings */ |
106 | sprintf(keyring_str[0], "%d", | 108 | sprintf(keyring_str[0], "%d", |
107 | cred->thread_keyring ? | 109 | cred->thread_keyring ? cred->thread_keyring->serial : 0); |
108 | cred->thread_keyring->serial : 0); | ||
109 | 110 | ||
110 | prkey = 0; | 111 | prkey = 0; |
111 | if (cred->tgcred->process_keyring) | 112 | if (cred->tgcred->process_keyring) |
@@ -155,8 +156,8 @@ error_link: | |||
155 | key_put(keyring); | 156 | key_put(keyring); |
156 | 157 | ||
157 | error_alloc: | 158 | error_alloc: |
158 | kleave(" = %d", ret); | ||
159 | complete_request_key(cons, ret); | 159 | complete_request_key(cons, ret); |
160 | kleave(" = %d", ret); | ||
160 | return ret; | 161 | return ret; |
161 | } | 162 | } |
162 | 163 | ||
@@ -295,6 +296,7 @@ static int construct_alloc_key(struct key_type *type, | |||
295 | struct key_user *user, | 296 | struct key_user *user, |
296 | struct key **_key) | 297 | struct key **_key) |
297 | { | 298 | { |
299 | const struct cred *cred = current_cred(); | ||
298 | struct key *key; | 300 | struct key *key; |
299 | key_ref_t key_ref; | 301 | key_ref_t key_ref; |
300 | 302 | ||
@@ -302,9 +304,8 @@ static int construct_alloc_key(struct key_type *type, | |||
302 | 304 | ||
303 | mutex_lock(&user->cons_lock); | 305 | mutex_lock(&user->cons_lock); |
304 | 306 | ||
305 | key = key_alloc(type, description, | 307 | key = key_alloc(type, description, cred->fsuid, cred->fsgid, cred, |
306 | current_fsuid(), current_fsgid(), current, KEY_POS_ALL, | 308 | KEY_POS_ALL, flags); |
307 | flags); | ||
308 | if (IS_ERR(key)) | 309 | if (IS_ERR(key)) |
309 | goto alloc_failed; | 310 | goto alloc_failed; |
310 | 311 | ||
@@ -317,8 +318,7 @@ static int construct_alloc_key(struct key_type *type, | |||
317 | * waited for locks */ | 318 | * waited for locks */ |
318 | mutex_lock(&key_construction_mutex); | 319 | mutex_lock(&key_construction_mutex); |
319 | 320 | ||
320 | key_ref = search_process_keyrings(type, description, type->match, | 321 | key_ref = search_process_keyrings(type, description, type->match, cred); |
321 | current); | ||
322 | if (!IS_ERR(key_ref)) | 322 | if (!IS_ERR(key_ref)) |
323 | goto key_already_present; | 323 | goto key_already_present; |
324 | 324 | ||
@@ -363,6 +363,8 @@ static struct key *construct_key_and_link(struct key_type *type, | |||
363 | struct key *key; | 363 | struct key *key; |
364 | int ret; | 364 | int ret; |
365 | 365 | ||
366 | kenter(""); | ||
367 | |||
366 | user = key_user_lookup(current_fsuid()); | 368 | user = key_user_lookup(current_fsuid()); |
367 | if (!user) | 369 | if (!user) |
368 | return ERR_PTR(-ENOMEM); | 370 | return ERR_PTR(-ENOMEM); |
@@ -376,17 +378,21 @@ static struct key *construct_key_and_link(struct key_type *type, | |||
376 | if (ret == 0) { | 378 | if (ret == 0) { |
377 | ret = construct_key(key, callout_info, callout_len, aux, | 379 | ret = construct_key(key, callout_info, callout_len, aux, |
378 | dest_keyring); | 380 | dest_keyring); |
379 | if (ret < 0) | 381 | if (ret < 0) { |
382 | kdebug("cons failed"); | ||
380 | goto construction_failed; | 383 | goto construction_failed; |
384 | } | ||
381 | } | 385 | } |
382 | 386 | ||
383 | key_put(dest_keyring); | 387 | key_put(dest_keyring); |
388 | kleave(" = key %d", key_serial(key)); | ||
384 | return key; | 389 | return key; |
385 | 390 | ||
386 | construction_failed: | 391 | construction_failed: |
387 | key_negate_and_link(key, key_negative_timeout, NULL, NULL); | 392 | key_negate_and_link(key, key_negative_timeout, NULL, NULL); |
388 | key_put(key); | 393 | key_put(key); |
389 | key_put(dest_keyring); | 394 | key_put(dest_keyring); |
395 | kleave(" = %d", ret); | ||
390 | return ERR_PTR(ret); | 396 | return ERR_PTR(ret); |
391 | } | 397 | } |
392 | 398 | ||
@@ -405,6 +411,7 @@ struct key *request_key_and_link(struct key_type *type, | |||
405 | struct key *dest_keyring, | 411 | struct key *dest_keyring, |
406 | unsigned long flags) | 412 | unsigned long flags) |
407 | { | 413 | { |
414 | const struct cred *cred = current_cred(); | ||
408 | struct key *key; | 415 | struct key *key; |
409 | key_ref_t key_ref; | 416 | key_ref_t key_ref; |
410 | 417 | ||
@@ -414,7 +421,7 @@ struct key *request_key_and_link(struct key_type *type, | |||
414 | 421 | ||
415 | /* search all the process keyrings for a key */ | 422 | /* search all the process keyrings for a key */ |
416 | key_ref = search_process_keyrings(type, description, type->match, | 423 | key_ref = search_process_keyrings(type, description, type->match, |
417 | current); | 424 | cred); |
418 | 425 | ||
419 | if (!IS_ERR(key_ref)) { | 426 | if (!IS_ERR(key_ref)) { |
420 | key = key_ref_to_ptr(key_ref); | 427 | key = key_ref_to_ptr(key_ref); |