diff options
Diffstat (limited to 'security/keys/encrypted-keys/encrypted.c')
| -rw-r--r-- | security/keys/encrypted-keys/encrypted.c | 9 | 
1 files changed, 8 insertions, 1 deletions
diff --git a/security/keys/encrypted-keys/encrypted.c b/security/keys/encrypted-keys/encrypted.c index 69855ba0d3b3..d92cbf9687c3 100644 --- a/security/keys/encrypted-keys/encrypted.c +++ b/security/keys/encrypted-keys/encrypted.c @@ -309,6 +309,13 @@ static struct key *request_user_key(const char *master_desc, const u8 **master_k  	down_read(&ukey->sem);  	upayload = user_key_payload_locked(ukey); +	if (!upayload) { +		/* key was revoked before we acquired its semaphore */ +		up_read(&ukey->sem); +		key_put(ukey); +		ukey = ERR_PTR(-EKEYREVOKED); +		goto error; +	}  	*master_key = upayload->data;  	*master_keylen = upayload->datalen;  error: @@ -847,7 +854,7 @@ static int encrypted_update(struct key *key, struct key_preparsed_payload *prep)  	size_t datalen = prep->datalen;  	int ret = 0; -	if (test_bit(KEY_FLAG_NEGATIVE, &key->flags)) +	if (key_is_negative(key))  		return -ENOKEY;  	if (datalen <= 0 || datalen > 32767 || !prep->data)  		return -EINVAL;  | 
