|
|
@@ -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:
|