summaryrefslogtreecommitdiffstats
path: root/security/keys
diff options
context:
space:
mode:
authorJames Morris <jmorris@namei.org>2012-02-09 07:02:34 +0100
committerJames Morris <jmorris@namei.org>2012-02-09 07:02:34 +0100
commit9e3ff38647a316e4f92d59b14c8f0eb13b33bb2c (patch)
tree2750d9fc94b8fb78d9982ea4a62d586e7f0a7862 /security/keys
parentMerge branch 'linus-master'; commit 'v3.3-rc3' into next (diff)
parentima: policy for RAMFS (diff)
downloadlinux-9e3ff38647a316e4f92d59b14c8f0eb13b33bb2c.tar.xz
linux-9e3ff38647a316e4f92d59b14c8f0eb13b33bb2c.zip
Merge branch 'next-queue' into next
Diffstat (limited to 'security/keys')
-rw-r--r--security/keys/keyctl.c15
1 files changed, 14 insertions, 1 deletions
diff --git a/security/keys/keyctl.c b/security/keys/keyctl.c
index 0b3f5d72af1c..6523599e9ac0 100644
--- a/security/keys/keyctl.c
+++ b/security/keys/keyctl.c
@@ -388,11 +388,24 @@ long keyctl_keyring_clear(key_serial_t ringid)
keyring_ref = lookup_user_key(ringid, KEY_LOOKUP_CREATE, KEY_WRITE);
if (IS_ERR(keyring_ref)) {
ret = PTR_ERR(keyring_ref);
+
+ /* Root is permitted to invalidate certain special keyrings */
+ if (capable(CAP_SYS_ADMIN)) {
+ keyring_ref = lookup_user_key(ringid, 0, 0);
+ if (IS_ERR(keyring_ref))
+ goto error;
+ if (test_bit(KEY_FLAG_ROOT_CAN_CLEAR,
+ &key_ref_to_ptr(keyring_ref)->flags))
+ goto clear;
+ goto error_put;
+ }
+
goto error;
}
+clear:
ret = keyring_clear(key_ref_to_ptr(keyring_ref));
-
+error_put:
key_ref_put(keyring_ref);
error:
return ret;