aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/capability.c
diff options
context:
space:
mode:
authorPavel Emelyanov <xemul@openvz.org>2007-10-19 02:40:14 -0400
committerLinus Torvalds <torvalds@woody.linux-foundation.org>2007-10-19 14:53:40 -0400
commitb488893a390edfe027bae7a46e9af8083e740668 (patch)
treec469a7f99ad01005a73011c029eb5e5d15454559 /kernel/capability.c
parent3eb07c8c8adb6f0572baba844ba2d9e501654316 (diff)
pid namespaces: changes to show virtual ids to user
This is the largest patch in the set. Make all (I hope) the places where the pid is shown to or get from user operate on the virtual pids. The idea is: - all in-kernel data structures must store either struct pid itself or the pid's global nr, obtained with pid_nr() call; - when seeking the task from kernel code with the stored id one should use find_task_by_pid() call that works with global pids; - when showing pid's numerical value to the user the virtual one should be used, but however when one shows task's pid outside this task's namespace the global one is to be used; - when getting the pid from userspace one need to consider this as the virtual one and use appropriate task/pid-searching functions. [akpm@linux-foundation.org: build fix] [akpm@linux-foundation.org: nuther build fix] [akpm@linux-foundation.org: yet nuther build fix] [akpm@linux-foundation.org: remove unneeded casts] Signed-off-by: Pavel Emelyanov <xemul@openvz.org> Signed-off-by: Alexey Dobriyan <adobriyan@openvz.org> Cc: Sukadev Bhattiprolu <sukadev@us.ibm.com> Cc: Oleg Nesterov <oleg@tv-sign.ru> Cc: Paul Menage <menage@google.com> Cc: "Eric W. Biederman" <ebiederm@xmission.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'kernel/capability.c')
-rw-r--r--kernel/capability.c14
1 files changed, 8 insertions, 6 deletions
diff --git a/kernel/capability.c b/kernel/capability.c
index f02ad47320b9..d4377c5a36c9 100644
--- a/kernel/capability.c
+++ b/kernel/capability.c
@@ -62,8 +62,9 @@ asmlinkage long sys_capget(cap_user_header_t header, cap_user_data_t dataptr)
62 spin_lock(&task_capability_lock); 62 spin_lock(&task_capability_lock);
63 read_lock(&tasklist_lock); 63 read_lock(&tasklist_lock);
64 64
65 if (pid && pid != current->pid) { 65 if (pid && pid != task_pid_vnr(current)) {
66 target = find_task_by_pid(pid); 66 target = find_task_by_pid_ns(pid,
67 current->nsproxy->pid_ns);
67 if (!target) { 68 if (!target) {
68 ret = -ESRCH; 69 ret = -ESRCH;
69 goto out; 70 goto out;
@@ -96,7 +97,7 @@ static inline int cap_set_pg(int pgrp_nr, kernel_cap_t *effective,
96 int found = 0; 97 int found = 0;
97 struct pid *pgrp; 98 struct pid *pgrp;
98 99
99 pgrp = find_pid(pgrp_nr); 100 pgrp = find_pid_ns(pgrp_nr, current->nsproxy->pid_ns);
100 do_each_pid_task(pgrp, PIDTYPE_PGID, g) { 101 do_each_pid_task(pgrp, PIDTYPE_PGID, g) {
101 target = g; 102 target = g;
102 while_each_thread(g, target) { 103 while_each_thread(g, target) {
@@ -185,7 +186,7 @@ asmlinkage long sys_capset(cap_user_header_t header, const cap_user_data_t data)
185 if (get_user(pid, &header->pid)) 186 if (get_user(pid, &header->pid))
186 return -EFAULT; 187 return -EFAULT;
187 188
188 if (pid && pid != current->pid && !capable(CAP_SETPCAP)) 189 if (pid && pid != task_pid_vnr(current) && !capable(CAP_SETPCAP))
189 return -EPERM; 190 return -EPERM;
190 191
191 if (copy_from_user(&effective, &data->effective, sizeof(effective)) || 192 if (copy_from_user(&effective, &data->effective, sizeof(effective)) ||
@@ -196,8 +197,9 @@ asmlinkage long sys_capset(cap_user_header_t header, const cap_user_data_t data)
196 spin_lock(&task_capability_lock); 197 spin_lock(&task_capability_lock);
197 read_lock(&tasklist_lock); 198 read_lock(&tasklist_lock);
198 199
199 if (pid > 0 && pid != current->pid) { 200 if (pid > 0 && pid != task_pid_vnr(current)) {
200 target = find_task_by_pid(pid); 201 target = find_task_by_pid_ns(pid,
202 current->nsproxy->pid_ns);
201 if (!target) { 203 if (!target) {
202 ret = -ESRCH; 204 ret = -ESRCH;
203 goto out; 205 goto out;