diff options
author | Tetsuo Handa <penguin-kernel@i-love.sakura.ne.jp> | 2010-02-25 03:19:25 -0500 |
---|---|---|
committer | James Morris <jmorris@namei.org> | 2010-02-25 17:20:11 -0500 |
commit | 1fcdc7c527010b144d3951f9ce25faedf264933c (patch) | |
tree | 5ab23281aae1de41079f2b4962fe17ab6d59be6d /security/tomoyo | |
parent | 189b3b1c89761054fee3438f063d7f257306e2d8 (diff) |
TOMOYO: Protect find_task_by_vpid() with RCU.
Holding tasklist_lock is no longer sufficient for find_task_by_vpid().
Explicit rcu_read_lock() is required.
Signed-off-by: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>
--
security/tomoyo/common.c | 4 ++++
1 file changed, 4 insertions(+)
Signed-off-by: James Morris <jmorris@namei.org>
Diffstat (limited to 'security/tomoyo')
-rw-r--r-- | security/tomoyo/common.c | 4 |
1 files changed, 4 insertions, 0 deletions
diff --git a/security/tomoyo/common.c b/security/tomoyo/common.c index 30dd1c68a647..ff51f1026b57 100644 --- a/security/tomoyo/common.c +++ b/security/tomoyo/common.c | |||
@@ -1232,11 +1232,13 @@ static bool tomoyo_is_select_one(struct tomoyo_io_buffer *head, | |||
1232 | 1232 | ||
1233 | if (sscanf(data, "pid=%u", &pid) == 1) { | 1233 | if (sscanf(data, "pid=%u", &pid) == 1) { |
1234 | struct task_struct *p; | 1234 | struct task_struct *p; |
1235 | rcu_read_lock(); | ||
1235 | read_lock(&tasklist_lock); | 1236 | read_lock(&tasklist_lock); |
1236 | p = find_task_by_vpid(pid); | 1237 | p = find_task_by_vpid(pid); |
1237 | if (p) | 1238 | if (p) |
1238 | domain = tomoyo_real_domain(p); | 1239 | domain = tomoyo_real_domain(p); |
1239 | read_unlock(&tasklist_lock); | 1240 | read_unlock(&tasklist_lock); |
1241 | rcu_read_unlock(); | ||
1240 | } else if (!strncmp(data, "domain=", 7)) { | 1242 | } else if (!strncmp(data, "domain=", 7)) { |
1241 | if (tomoyo_is_domain_def(data + 7)) | 1243 | if (tomoyo_is_domain_def(data + 7)) |
1242 | domain = tomoyo_find_domain(data + 7); | 1244 | domain = tomoyo_find_domain(data + 7); |
@@ -1635,11 +1637,13 @@ static int tomoyo_read_pid(struct tomoyo_io_buffer *head) | |||
1635 | const int pid = head->read_step; | 1637 | const int pid = head->read_step; |
1636 | struct task_struct *p; | 1638 | struct task_struct *p; |
1637 | struct tomoyo_domain_info *domain = NULL; | 1639 | struct tomoyo_domain_info *domain = NULL; |
1640 | rcu_read_lock(); | ||
1638 | read_lock(&tasklist_lock); | 1641 | read_lock(&tasklist_lock); |
1639 | p = find_task_by_vpid(pid); | 1642 | p = find_task_by_vpid(pid); |
1640 | if (p) | 1643 | if (p) |
1641 | domain = tomoyo_real_domain(p); | 1644 | domain = tomoyo_real_domain(p); |
1642 | read_unlock(&tasklist_lock); | 1645 | read_unlock(&tasklist_lock); |
1646 | rcu_read_unlock(); | ||
1643 | if (domain) | 1647 | if (domain) |
1644 | tomoyo_io_printf(head, "%d %u %s", pid, domain->profile, | 1648 | tomoyo_io_printf(head, "%d %u %s", pid, domain->profile, |
1645 | domain->domainname->name); | 1649 | domain->domainname->name); |