diff options
author | David Howells <dhowells@redhat.com> | 2010-04-27 17:05:11 -0400 |
---|---|---|
committer | James Morris <jmorris@namei.org> | 2010-04-27 18:37:15 -0400 |
commit | b59ec78cdcc57e02bc3dddfa7134a2f0fd15c34d (patch) | |
tree | 60ba3c907d4d83873bce5eb645ae8bd9415399b8 /security | |
parent | b91ce4d14a21fc04d165be30319541e0f9204f15 (diff) |
keys: don't need to use RCU in keyring_read() as semaphore is held
keyring_read() doesn't need to use rcu_dereference() to access the keyring
payload as the caller holds the key semaphore to prevent modifications
from happening whilst the data is read out.
This should solve the following warning:
===================================================
[ INFO: suspicious rcu_dereference_check() usage. ]
---------------------------------------------------
security/keys/keyring.c:204 invoked rcu_dereference_check() without protection!
other info that might help us debug this:
rcu_scheduler_active = 1, debug_locks = 0
1 lock held by keyctl/2144:
#0: (&key->sem){+++++.}, at: [<ffffffff81177f7c>] keyctl_read_key+0x9c/0xcf
stack backtrace:
Pid: 2144, comm: keyctl Not tainted 2.6.34-rc2-cachefs #113
Call Trace:
[<ffffffff8105121f>] lockdep_rcu_dereference+0xaa/0xb2
[<ffffffff811762d5>] keyring_read+0x4d/0xe7
[<ffffffff81177f8c>] keyctl_read_key+0xac/0xcf
[<ffffffff811788d4>] sys_keyctl+0x75/0xb9
[<ffffffff81001eeb>] system_call_fastpath+0x16/0x1b
Signed-off-by: David Howells <dhowells@redhat.com>
Cc: Herbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: James Morris <jmorris@namei.org>
Diffstat (limited to 'security')
-rw-r--r-- | security/keys/keyring.c | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/security/keys/keyring.c b/security/keys/keyring.c index e814d2109f8e..dd7cd0f8e13c 100644 --- a/security/keys/keyring.c +++ b/security/keys/keyring.c | |||
@@ -201,7 +201,7 @@ static long keyring_read(const struct key *keyring, | |||
201 | int loop, ret; | 201 | int loop, ret; |
202 | 202 | ||
203 | ret = 0; | 203 | ret = 0; |
204 | klist = rcu_dereference(keyring->payload.subscriptions); | 204 | klist = keyring->payload.subscriptions; |
205 | 205 | ||
206 | if (klist) { | 206 | if (klist) { |
207 | /* calculate how much data we could return */ | 207 | /* calculate how much data we could return */ |