[added to the 4.1 stable tree] KEYS: refcount bug fix
From: Sasha Levin <hidden>
Date: 2016-02-10 15:14:14
Subsystem:
keys/keyrings, security subsystem, the rest · Maintainers:
David Howells, Jarkko Sakkinen, Paul Moore, James Morris, "Serge E. Hallyn", Linus Torvalds
From: Mimi Zohar <redacted> This patch has been added to the 4.1 stable tree. If you have any objections, please let us know. =============== [ Upstream commit 1d6d167c2efcfe9539d9cffb1a1be9c92e39c2c0 ] This patch fixes the key_ref leak, removes the unnecessary KEY_FLAG_KEEP test before setting the flag, and cleans up the if/then brackets style introduced in commit: d3600bc KEYS: prevent keys from being removed from specified keyrings Reported-by: David Howells <dhowells@redhat.com> Signed-off-by: Mimi Zohar <redacted> Acked-by: David Howells <dhowells@redhat.com> Signed-off-by: Sasha Levin <redacted> --- security/keys/key.c | 3 +-- security/keys/keyctl.c | 17 +++++++---------- 2 files changed, 8 insertions(+), 12 deletions(-)
diff --git a/security/keys/key.c b/security/keys/key.c
index 3ac72df..0a0ff94 100644
--- a/security/keys/key.c
+++ b/security/keys/key.c@@ -430,8 +430,7 @@ static int __key_instantiate_and_link(struct key *key, /* and link it into the destination keyring */ if (keyring) { - if (test_bit(KEY_FLAG_KEEP, &keyring->flags)) - set_bit(KEY_FLAG_KEEP, &key->flags); + set_bit(KEY_FLAG_KEEP, &key->flags); __key_link(key, _edit); }
diff --git a/security/keys/keyctl.c b/security/keys/keyctl.c
index 4cfbc7f..8400dd9 100644
--- a/security/keys/keyctl.c
+++ b/security/keys/keyctl.c@@ -387,12 +387,11 @@ long keyctl_revoke_key(key_serial_t id) } key = key_ref_to_ptr(key_ref); + ret = 0; if (test_bit(KEY_FLAG_KEEP, &key->flags)) - return -EPERM; - else { + ret = -EPERM; + else key_revoke(key); - ret = 0; - } key_ref_put(key_ref); error:
@@ -438,12 +437,11 @@ long keyctl_invalidate_key(key_serial_t id) invalidate: key = key_ref_to_ptr(key_ref); + ret = 0; if (test_bit(KEY_FLAG_KEEP, &key->flags)) ret = -EPERM; - else { + else key_invalidate(key); - ret = 0; - } error_put: key_ref_put(key_ref); error:
@@ -1358,12 +1356,11 @@ long keyctl_set_timeout(key_serial_t id, unsigned timeout) okay: key = key_ref_to_ptr(key_ref); + ret = 0; if (test_bit(KEY_FLAG_KEEP, &key->flags)) ret = -EPERM; - else { + else key_set_timeout(key, timeout); - ret = 0; - } key_put(key); error:
--
2.5.0