diff options
Diffstat (limited to 'security/keys/request_key.c')
-rw-r--r-- | security/keys/request_key.c | 36 |
1 files changed, 29 insertions, 7 deletions
diff --git a/security/keys/request_key.c b/security/keys/request_key.c index 90c1506d007c..e6dd366d43a3 100644 --- a/security/keys/request_key.c +++ b/security/keys/request_key.c | |||
@@ -129,7 +129,7 @@ static struct key *__request_key_construction(struct key_type *type, | |||
129 | 129 | ||
130 | /* create a key and add it to the queue */ | 130 | /* create a key and add it to the queue */ |
131 | key = key_alloc(type, description, | 131 | key = key_alloc(type, description, |
132 | current->fsuid, current->fsgid, KEY_USR_ALL, 0); | 132 | current->fsuid, current->fsgid, KEY_POS_ALL, 0); |
133 | if (IS_ERR(key)) | 133 | if (IS_ERR(key)) |
134 | goto alloc_failed; | 134 | goto alloc_failed; |
135 | 135 | ||
@@ -365,14 +365,24 @@ struct key *request_key_and_link(struct key_type *type, | |||
365 | { | 365 | { |
366 | struct key_user *user; | 366 | struct key_user *user; |
367 | struct key *key; | 367 | struct key *key; |
368 | key_ref_t key_ref; | ||
368 | 369 | ||
369 | kenter("%s,%s,%s,%p", | 370 | kenter("%s,%s,%s,%p", |
370 | type->name, description, callout_info, dest_keyring); | 371 | type->name, description, callout_info, dest_keyring); |
371 | 372 | ||
372 | /* search all the process keyrings for a key */ | 373 | /* search all the process keyrings for a key */ |
373 | key = search_process_keyrings(type, description, type->match, current); | 374 | key_ref = search_process_keyrings(type, description, type->match, |
375 | current); | ||
374 | 376 | ||
375 | if (PTR_ERR(key) == -EAGAIN) { | 377 | kdebug("search 1: %p", key_ref); |
378 | |||
379 | if (!IS_ERR(key_ref)) { | ||
380 | key = key_ref_to_ptr(key_ref); | ||
381 | } | ||
382 | else if (PTR_ERR(key_ref) != -EAGAIN) { | ||
383 | key = ERR_PTR(PTR_ERR(key_ref)); | ||
384 | } | ||
385 | else { | ||
376 | /* the search failed, but the keyrings were searchable, so we | 386 | /* the search failed, but the keyrings were searchable, so we |
377 | * should consult userspace if we can */ | 387 | * should consult userspace if we can */ |
378 | key = ERR_PTR(-ENOKEY); | 388 | key = ERR_PTR(-ENOKEY); |
@@ -384,7 +394,7 @@ struct key *request_key_and_link(struct key_type *type, | |||
384 | if (!user) | 394 | if (!user) |
385 | goto nomem; | 395 | goto nomem; |
386 | 396 | ||
387 | do { | 397 | for (;;) { |
388 | if (signal_pending(current)) | 398 | if (signal_pending(current)) |
389 | goto interrupted; | 399 | goto interrupted; |
390 | 400 | ||
@@ -397,10 +407,22 @@ struct key *request_key_and_link(struct key_type *type, | |||
397 | 407 | ||
398 | /* someone else made the key we want, so we need to | 408 | /* someone else made the key we want, so we need to |
399 | * search again as it might now be available to us */ | 409 | * search again as it might now be available to us */ |
400 | key = search_process_keyrings(type, description, | 410 | key_ref = search_process_keyrings(type, description, |
401 | type->match, current); | 411 | type->match, |
412 | current); | ||
413 | |||
414 | kdebug("search 2: %p", key_ref); | ||
402 | 415 | ||
403 | } while (PTR_ERR(key) == -EAGAIN); | 416 | if (!IS_ERR(key_ref)) { |
417 | key = key_ref_to_ptr(key_ref); | ||
418 | break; | ||
419 | } | ||
420 | |||
421 | if (PTR_ERR(key_ref) != -EAGAIN) { | ||
422 | key = ERR_PTR(PTR_ERR(key_ref)); | ||
423 | break; | ||
424 | } | ||
425 | } | ||
404 | 426 | ||
405 | key_user_put(user); | 427 | key_user_put(user); |
406 | 428 | ||