summaryrefslogtreecommitdiffstats
path: root/security
diff options
context:
space:
mode:
authorAl Viro <viro@zeniv.linux.org.uk>2016-01-08 21:20:11 -0500
committerAl Viro <viro@zeniv.linux.org.uk>2016-01-08 21:20:11 -0500
commit6108209c4ae964836f6bac5210f1c64153800b62 (patch)
tree83651902b46af6bbf8d2ea4841b397bac306095b /security
parenta1c6f05733c27ba7067c06c095f49e8732a5ae17 (diff)
parenta7f61e89af73e9bf760826b20dba4e637221fcb9 (diff)
downloadlinux-6108209c4ae964836f6bac5210f1c64153800b62.tar.bz2
Merge branch 'for-linus' into work.misc
Diffstat (limited to 'security')
-rw-r--r--security/keys/keyctl.c18
1 files changed, 9 insertions, 9 deletions
diff --git a/security/keys/keyctl.c b/security/keys/keyctl.c
index fb111eafcb89..1c3872aeed14 100644
--- a/security/keys/keyctl.c
+++ b/security/keys/keyctl.c
@@ -751,16 +751,16 @@ long keyctl_read_key(key_serial_t keyid, char __user *buffer, size_t buflen)
/* the key is probably readable - now try to read it */
can_read_key:
- ret = key_validate(key);
- if (ret == 0) {
- ret = -EOPNOTSUPP;
- if (key->type->read) {
- /* read the data with the semaphore held (since we
- * might sleep) */
- down_read(&key->sem);
+ ret = -EOPNOTSUPP;
+ if (key->type->read) {
+ /* Read the data with the semaphore held (since we might sleep)
+ * to protect against the key being updated or revoked.
+ */
+ down_read(&key->sem);
+ ret = key_validate(key);
+ if (ret == 0)
ret = key->type->read(key, buffer, buflen);
- up_read(&key->sem);
- }
+ up_read(&key->sem);
}
error2: