aboutsummaryrefslogtreecommitdiffstats
path: root/security
diff options
context:
space:
mode:
authorDavid Howells <dhowells@redhat.com>2010-04-27 16:13:08 -0400
committerGreg Kroah-Hartman <gregkh@suse.de>2010-05-12 18:02:34 -0400
commitb916189a5e80cabb49b1c64a350a5f13e485cb61 (patch)
tree02ce4fa43254a65f2dcb38f4b5b887580ca530a5 /security
parent79343596acdab2cfc0bc79cf2eed5155138f6c18 (diff)
keys: the request_key() syscall should link an existing key to the dest keyring
commit 03449cd9eaa4fa3a7faa4a59474bafe2e90bd143 upstream. The request_key() system call and request_key_and_link() should make a link from an existing key to the destination keyring (if supplied), not just from a new key to the destination keyring. This can be tested by: ring=`keyctl newring fred @s` keyctl request2 user debug:a a keyctl request user debug:a $ring keyctl list $ring If it says: keyring is empty then it didn't work. If it shows something like: 1 key in keyring: 1070462727: --alswrv 0 0 user: debug:a then it did. request_key() system call is meant to recursively search all your keyrings for the key you desire, and, optionally, if it doesn't exist, call out to userspace to create one for you. If request_key() finds or creates a key, it should, optionally, create a link to that key from the destination keyring specified. Therefore, if, after a successful call to request_key() with a desination keyring specified, you see the destination keyring empty, the code didn't work correctly. If you see the found key in the keyring, then it did - which is what the patch is required for. Signed-off-by: David Howells <dhowells@redhat.com> Cc: James Morris <jmorris@namei.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'security')
-rw-r--r--security/keys/request_key.c9
1 files changed, 8 insertions, 1 deletions
diff --git a/security/keys/request_key.c b/security/keys/request_key.c
index 03fe63ed55bd..9ac7bfd3bbdd 100644
--- a/security/keys/request_key.c
+++ b/security/keys/request_key.c
@@ -336,8 +336,10 @@ static int construct_alloc_key(struct key_type *type,
336 336
337key_already_present: 337key_already_present:
338 mutex_unlock(&key_construction_mutex); 338 mutex_unlock(&key_construction_mutex);
339 if (dest_keyring) 339 if (dest_keyring) {
340 __key_link(dest_keyring, key_ref_to_ptr(key_ref));
340 up_write(&dest_keyring->sem); 341 up_write(&dest_keyring->sem);
342 }
341 mutex_unlock(&user->cons_lock); 343 mutex_unlock(&user->cons_lock);
342 key_put(key); 344 key_put(key);
343 *_key = key = key_ref_to_ptr(key_ref); 345 *_key = key = key_ref_to_ptr(key_ref);
@@ -428,6 +430,11 @@ struct key *request_key_and_link(struct key_type *type,
428 430
429 if (!IS_ERR(key_ref)) { 431 if (!IS_ERR(key_ref)) {
430 key = key_ref_to_ptr(key_ref); 432 key = key_ref_to_ptr(key_ref);
433 if (dest_keyring) {
434 construct_get_dest_keyring(&dest_keyring);
435 key_link(dest_keyring, key);
436 key_put(dest_keyring);
437 }
431 } else if (PTR_ERR(key_ref) != -EAGAIN) { 438 } else if (PTR_ERR(key_ref) != -EAGAIN) {
432 key = ERR_CAST(key_ref); 439 key = ERR_CAST(key_ref);
433 } else { 440 } else {