aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/capability.c
diff options
context:
space:
mode:
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;