diff options
Diffstat (limited to 'security/keys/keyring.c')
| -rw-r--r-- | security/keys/keyring.c | 4 | 
1 files changed, 3 insertions, 1 deletions
diff --git a/security/keys/keyring.c b/security/keys/keyring.c index 8ec02746ca9..e814d2109f8 100644 --- a/security/keys/keyring.c +++ b/security/keys/keyring.c @@ -151,7 +151,9 @@ static void keyring_destroy(struct key *keyring)  		write_unlock(&keyring_name_lock);  	} -	klist = rcu_dereference(keyring->payload.subscriptions); +	klist = rcu_dereference_check(keyring->payload.subscriptions, +				      rcu_read_lock_held() || +				      atomic_read(&keyring->usage) == 0);  	if (klist) {  		for (loop = klist->nkeys - 1; loop >= 0; loop--)  			key_put(klist->keys[loop]);  |