diff options
author | Thomas Gleixner <tglx@linutronix.de> | 2009-12-09 17:13:31 +0100 |
---|---|---|
committer | James Morris <jmorris@namei.org> | 2009-12-10 09:42:48 +1100 |
commit | 86fc80f16e8a2449d5827bf1a9838b7fd9f70097 (patch) | |
tree | 23f4d20995f9538c6f609baa2d0bf3315f013b46 /kernel | |
parent | 67fa4880c5e059428392ca6f7c2f9c38e8546fea (diff) | |
download | op-kernel-dev-86fc80f16e8a2449d5827bf1a9838b7fd9f70097.zip op-kernel-dev-86fc80f16e8a2449d5827bf1a9838b7fd9f70097.tar.gz |
capabilities: Use RCU to protect task lookup in sys_capget
cap_get_target_pid() protects the task lookup with tasklist_lock.
security_capget() is called under tasklist_lock as well but
tasklist_lock does not protect anything there. The capabilities are
protected by RCU already.
So tasklist_lock only protects the lookup and prevents the task going
away, which can be done with rcu_read_lock() as well.
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: James Morris <jmorris@namei.org>
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/capability.c | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/kernel/capability.c b/kernel/capability.c index 7f876e6..9e4697e 100644 --- a/kernel/capability.c +++ b/kernel/capability.c @@ -135,7 +135,7 @@ static inline int cap_get_target_pid(pid_t pid, kernel_cap_t *pEp, if (pid && (pid != task_pid_vnr(current))) { struct task_struct *target; - read_lock(&tasklist_lock); + rcu_read_lock(); target = find_task_by_vpid(pid); if (!target) @@ -143,7 +143,7 @@ static inline int cap_get_target_pid(pid_t pid, kernel_cap_t *pEp, else ret = security_capget(target, pEp, pIp, pPp); - read_unlock(&tasklist_lock); + rcu_read_unlock(); } else ret = security_capget(current, pEp, pIp, pPp); |