aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2015-10-20 03:09:36 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2015-10-20 03:09:36 -0400
commitce1fad2740c648a4340f6f6c391a8a83769d2e8c (patch)
tree8d19a392845cae4ca37639ace41105c34a7b20d1
parent1099f86044111e9a7807f09523e42d4c9d0fb781 (diff)
parent911b79cde95c7da0ec02f48105358a36636b7a71 (diff)
Merge branch 'keys-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/dhowells/linux-fs
Pull key handling fixes from David Howells: "Here are two patches, the first of which at least should go upstream immediately: (1) Prevent a user-triggerable crash in the keyrings destructor when a negatively instantiated keyring is garbage collected. I have also seen this triggered for user type keys. (2) Prevent the user from using requesting that a keyring be created and instantiated through an upcall. Doing so is probably safe since the keyring type ignores the arguments to its instantiation function - but we probably shouldn't let keyrings be created in this manner" * 'keys-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/dhowells/linux-fs: KEYS: Don't permit request_key() to construct a new keyring KEYS: Fix crash when attempt to garbage collect an uninstantiated keyring
-rw-r--r--security/keys/gc.c6
-rw-r--r--security/keys/request_key.c3
2 files changed, 7 insertions, 2 deletions
diff --git a/security/keys/gc.c b/security/keys/gc.c
index 39eac1fd5706..addf060399e0 100644
--- a/security/keys/gc.c
+++ b/security/keys/gc.c
@@ -134,8 +134,10 @@ static noinline void key_gc_unused_keys(struct list_head *keys)
134 kdebug("- %u", key->serial); 134 kdebug("- %u", key->serial);
135 key_check(key); 135 key_check(key);
136 136
137 /* Throw away the key data */ 137 /* Throw away the key data if the key is instantiated */
138 if (key->type->destroy) 138 if (test_bit(KEY_FLAG_INSTANTIATED, &key->flags) &&
139 !test_bit(KEY_FLAG_NEGATIVE, &key->flags) &&
140 key->type->destroy)
139 key->type->destroy(key); 141 key->type->destroy(key);
140 142
141 security_key_free(key); 143 security_key_free(key);
diff --git a/security/keys/request_key.c b/security/keys/request_key.c
index 486ef6fa393b..0d6253124278 100644
--- a/security/keys/request_key.c
+++ b/security/keys/request_key.c
@@ -440,6 +440,9 @@ static struct key *construct_key_and_link(struct keyring_search_context *ctx,
440 440
441 kenter(""); 441 kenter("");
442 442
443 if (ctx->index_key.type == &key_type_keyring)
444 return ERR_PTR(-EPERM);
445
443 user = key_user_lookup(current_fsuid()); 446 user = key_user_lookup(current_fsuid());
444 if (!user) 447 if (!user)
445 return ERR_PTR(-ENOMEM); 448 return ERR_PTR(-ENOMEM);