diff options
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/capability.c | 14 | ||||
-rw-r--r-- | kernel/exit.c | 31 | ||||
-rw-r--r-- | kernel/fork.c | 2 | ||||
-rw-r--r-- | kernel/futex.c | 27 | ||||
-rw-r--r-- | kernel/futex_compat.c | 4 | ||||
-rw-r--r-- | kernel/ptrace.c | 4 | ||||
-rw-r--r-- | kernel/sched.c | 6 | ||||
-rw-r--r-- | kernel/signal.c | 52 | ||||
-rw-r--r-- | kernel/sys.c | 54 | ||||
-rw-r--r-- | kernel/sysctl.c | 2 | ||||
-rw-r--r-- | kernel/timer.c | 7 |
11 files changed, 132 insertions, 71 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; |
diff --git a/kernel/exit.c b/kernel/exit.c index 567909fd6be4..68d27039ef7d 100644 --- a/kernel/exit.c +++ b/kernel/exit.c | |||
@@ -1112,15 +1112,17 @@ asmlinkage void sys_exit_group(int error_code) | |||
1112 | static int eligible_child(pid_t pid, int options, struct task_struct *p) | 1112 | static int eligible_child(pid_t pid, int options, struct task_struct *p) |
1113 | { | 1113 | { |
1114 | int err; | 1114 | int err; |
1115 | struct pid_namespace *ns; | ||
1115 | 1116 | ||
1117 | ns = current->nsproxy->pid_ns; | ||
1116 | if (pid > 0) { | 1118 | if (pid > 0) { |
1117 | if (p->pid != pid) | 1119 | if (task_pid_nr_ns(p, ns) != pid) |
1118 | return 0; | 1120 | return 0; |
1119 | } else if (!pid) { | 1121 | } else if (!pid) { |
1120 | if (task_pgrp_nr(p) != task_pgrp_nr(current)) | 1122 | if (task_pgrp_nr_ns(p, ns) != task_pgrp_vnr(current)) |
1121 | return 0; | 1123 | return 0; |
1122 | } else if (pid != -1) { | 1124 | } else if (pid != -1) { |
1123 | if (task_pgrp_nr(p) != -pid) | 1125 | if (task_pgrp_nr_ns(p, ns) != -pid) |
1124 | return 0; | 1126 | return 0; |
1125 | } | 1127 | } |
1126 | 1128 | ||
@@ -1190,9 +1192,12 @@ static int wait_task_zombie(struct task_struct *p, int noreap, | |||
1190 | { | 1192 | { |
1191 | unsigned long state; | 1193 | unsigned long state; |
1192 | int retval, status, traced; | 1194 | int retval, status, traced; |
1195 | struct pid_namespace *ns; | ||
1196 | |||
1197 | ns = current->nsproxy->pid_ns; | ||
1193 | 1198 | ||
1194 | if (unlikely(noreap)) { | 1199 | if (unlikely(noreap)) { |
1195 | pid_t pid = p->pid; | 1200 | pid_t pid = task_pid_nr_ns(p, ns); |
1196 | uid_t uid = p->uid; | 1201 | uid_t uid = p->uid; |
1197 | int exit_code = p->exit_code; | 1202 | int exit_code = p->exit_code; |
1198 | int why, status; | 1203 | int why, status; |
@@ -1311,11 +1316,11 @@ static int wait_task_zombie(struct task_struct *p, int noreap, | |||
1311 | retval = put_user(status, &infop->si_status); | 1316 | retval = put_user(status, &infop->si_status); |
1312 | } | 1317 | } |
1313 | if (!retval && infop) | 1318 | if (!retval && infop) |
1314 | retval = put_user(p->pid, &infop->si_pid); | 1319 | retval = put_user(task_pid_nr_ns(p, ns), &infop->si_pid); |
1315 | if (!retval && infop) | 1320 | if (!retval && infop) |
1316 | retval = put_user(p->uid, &infop->si_uid); | 1321 | retval = put_user(p->uid, &infop->si_uid); |
1317 | if (!retval) | 1322 | if (!retval) |
1318 | retval = p->pid; | 1323 | retval = task_pid_nr_ns(p, ns); |
1319 | 1324 | ||
1320 | if (traced) { | 1325 | if (traced) { |
1321 | write_lock_irq(&tasklist_lock); | 1326 | write_lock_irq(&tasklist_lock); |
@@ -1352,6 +1357,7 @@ static int wait_task_stopped(struct task_struct *p, int delayed_group_leader, | |||
1352 | int __user *stat_addr, struct rusage __user *ru) | 1357 | int __user *stat_addr, struct rusage __user *ru) |
1353 | { | 1358 | { |
1354 | int retval, exit_code; | 1359 | int retval, exit_code; |
1360 | struct pid_namespace *ns; | ||
1355 | 1361 | ||
1356 | if (!p->exit_code) | 1362 | if (!p->exit_code) |
1357 | return 0; | 1363 | return 0; |
@@ -1370,11 +1376,12 @@ static int wait_task_stopped(struct task_struct *p, int delayed_group_leader, | |||
1370 | * keep holding onto the tasklist_lock while we call getrusage and | 1376 | * keep holding onto the tasklist_lock while we call getrusage and |
1371 | * possibly take page faults for user memory. | 1377 | * possibly take page faults for user memory. |
1372 | */ | 1378 | */ |
1379 | ns = current->nsproxy->pid_ns; | ||
1373 | get_task_struct(p); | 1380 | get_task_struct(p); |
1374 | read_unlock(&tasklist_lock); | 1381 | read_unlock(&tasklist_lock); |
1375 | 1382 | ||
1376 | if (unlikely(noreap)) { | 1383 | if (unlikely(noreap)) { |
1377 | pid_t pid = p->pid; | 1384 | pid_t pid = task_pid_nr_ns(p, ns); |
1378 | uid_t uid = p->uid; | 1385 | uid_t uid = p->uid; |
1379 | int why = (p->ptrace & PT_PTRACED) ? CLD_TRAPPED : CLD_STOPPED; | 1386 | int why = (p->ptrace & PT_PTRACED) ? CLD_TRAPPED : CLD_STOPPED; |
1380 | 1387 | ||
@@ -1445,11 +1452,11 @@ bail_ref: | |||
1445 | if (!retval && infop) | 1452 | if (!retval && infop) |
1446 | retval = put_user(exit_code, &infop->si_status); | 1453 | retval = put_user(exit_code, &infop->si_status); |
1447 | if (!retval && infop) | 1454 | if (!retval && infop) |
1448 | retval = put_user(p->pid, &infop->si_pid); | 1455 | retval = put_user(task_pid_nr_ns(p, ns), &infop->si_pid); |
1449 | if (!retval && infop) | 1456 | if (!retval && infop) |
1450 | retval = put_user(p->uid, &infop->si_uid); | 1457 | retval = put_user(p->uid, &infop->si_uid); |
1451 | if (!retval) | 1458 | if (!retval) |
1452 | retval = p->pid; | 1459 | retval = task_pid_nr_ns(p, ns); |
1453 | put_task_struct(p); | 1460 | put_task_struct(p); |
1454 | 1461 | ||
1455 | BUG_ON(!retval); | 1462 | BUG_ON(!retval); |
@@ -1469,6 +1476,7 @@ static int wait_task_continued(struct task_struct *p, int noreap, | |||
1469 | int retval; | 1476 | int retval; |
1470 | pid_t pid; | 1477 | pid_t pid; |
1471 | uid_t uid; | 1478 | uid_t uid; |
1479 | struct pid_namespace *ns; | ||
1472 | 1480 | ||
1473 | if (!(p->signal->flags & SIGNAL_STOP_CONTINUED)) | 1481 | if (!(p->signal->flags & SIGNAL_STOP_CONTINUED)) |
1474 | return 0; | 1482 | return 0; |
@@ -1483,7 +1491,8 @@ static int wait_task_continued(struct task_struct *p, int noreap, | |||
1483 | p->signal->flags &= ~SIGNAL_STOP_CONTINUED; | 1491 | p->signal->flags &= ~SIGNAL_STOP_CONTINUED; |
1484 | spin_unlock_irq(&p->sighand->siglock); | 1492 | spin_unlock_irq(&p->sighand->siglock); |
1485 | 1493 | ||
1486 | pid = p->pid; | 1494 | ns = current->nsproxy->pid_ns; |
1495 | pid = task_pid_nr_ns(p, ns); | ||
1487 | uid = p->uid; | 1496 | uid = p->uid; |
1488 | get_task_struct(p); | 1497 | get_task_struct(p); |
1489 | read_unlock(&tasklist_lock); | 1498 | read_unlock(&tasklist_lock); |
@@ -1494,7 +1503,7 @@ static int wait_task_continued(struct task_struct *p, int noreap, | |||
1494 | if (!retval && stat_addr) | 1503 | if (!retval && stat_addr) |
1495 | retval = put_user(0xffff, stat_addr); | 1504 | retval = put_user(0xffff, stat_addr); |
1496 | if (!retval) | 1505 | if (!retval) |
1497 | retval = p->pid; | 1506 | retval = task_pid_nr_ns(p, ns); |
1498 | } else { | 1507 | } else { |
1499 | retval = wait_noreap_copyout(p, pid, uid, | 1508 | retval = wait_noreap_copyout(p, pid, uid, |
1500 | CLD_CONTINUED, SIGCONT, | 1509 | CLD_CONTINUED, SIGCONT, |
diff --git a/kernel/fork.c b/kernel/fork.c index ce9297e4e7d4..a794bfcf6003 100644 --- a/kernel/fork.c +++ b/kernel/fork.c | |||
@@ -950,7 +950,7 @@ asmlinkage long sys_set_tid_address(int __user *tidptr) | |||
950 | { | 950 | { |
951 | current->clear_child_tid = tidptr; | 951 | current->clear_child_tid = tidptr; |
952 | 952 | ||
953 | return current->pid; | 953 | return task_pid_vnr(current); |
954 | } | 954 | } |
955 | 955 | ||
956 | static inline void rt_mutex_init_task(struct task_struct *p) | 956 | static inline void rt_mutex_init_task(struct task_struct *p) |
diff --git a/kernel/futex.c b/kernel/futex.c index e45a65e41686..86b2600381b6 100644 --- a/kernel/futex.c +++ b/kernel/futex.c | |||
@@ -53,6 +53,9 @@ | |||
53 | #include <linux/signal.h> | 53 | #include <linux/signal.h> |
54 | #include <linux/module.h> | 54 | #include <linux/module.h> |
55 | #include <linux/magic.h> | 55 | #include <linux/magic.h> |
56 | #include <linux/pid.h> | ||
57 | #include <linux/nsproxy.h> | ||
58 | |||
56 | #include <asm/futex.h> | 59 | #include <asm/futex.h> |
57 | 60 | ||
58 | #include "rtmutex_common.h" | 61 | #include "rtmutex_common.h" |
@@ -443,7 +446,8 @@ static struct task_struct * futex_find_get_task(pid_t pid) | |||
443 | struct task_struct *p; | 446 | struct task_struct *p; |
444 | 447 | ||
445 | rcu_read_lock(); | 448 | rcu_read_lock(); |
446 | p = find_task_by_pid(pid); | 449 | p = find_task_by_pid_ns(pid, |
450 | current->nsproxy->pid_ns); | ||
447 | 451 | ||
448 | if (!p || ((current->euid != p->euid) && (current->euid != p->uid))) | 452 | if (!p || ((current->euid != p->euid) && (current->euid != p->uid))) |
449 | p = ERR_PTR(-ESRCH); | 453 | p = ERR_PTR(-ESRCH); |
@@ -653,7 +657,7 @@ static int wake_futex_pi(u32 __user *uaddr, u32 uval, struct futex_q *this) | |||
653 | if (!(uval & FUTEX_OWNER_DIED)) { | 657 | if (!(uval & FUTEX_OWNER_DIED)) { |
654 | int ret = 0; | 658 | int ret = 0; |
655 | 659 | ||
656 | newval = FUTEX_WAITERS | new_owner->pid; | 660 | newval = FUTEX_WAITERS | task_pid_vnr(new_owner); |
657 | 661 | ||
658 | curval = cmpxchg_futex_value_locked(uaddr, uval, newval); | 662 | curval = cmpxchg_futex_value_locked(uaddr, uval, newval); |
659 | 663 | ||
@@ -1106,7 +1110,7 @@ static void unqueue_me_pi(struct futex_q *q) | |||
1106 | static int fixup_pi_state_owner(u32 __user *uaddr, struct futex_q *q, | 1110 | static int fixup_pi_state_owner(u32 __user *uaddr, struct futex_q *q, |
1107 | struct task_struct *curr) | 1111 | struct task_struct *curr) |
1108 | { | 1112 | { |
1109 | u32 newtid = curr->pid | FUTEX_WAITERS; | 1113 | u32 newtid = task_pid_vnr(curr) | FUTEX_WAITERS; |
1110 | struct futex_pi_state *pi_state = q->pi_state; | 1114 | struct futex_pi_state *pi_state = q->pi_state; |
1111 | u32 uval, curval, newval; | 1115 | u32 uval, curval, newval; |
1112 | int ret; | 1116 | int ret; |
@@ -1368,7 +1372,7 @@ static int futex_lock_pi(u32 __user *uaddr, struct rw_semaphore *fshared, | |||
1368 | * (by doing a 0 -> TID atomic cmpxchg), while holding all | 1372 | * (by doing a 0 -> TID atomic cmpxchg), while holding all |
1369 | * the locks. It will most likely not succeed. | 1373 | * the locks. It will most likely not succeed. |
1370 | */ | 1374 | */ |
1371 | newval = current->pid; | 1375 | newval = task_pid_vnr(current); |
1372 | 1376 | ||
1373 | curval = cmpxchg_futex_value_locked(uaddr, 0, newval); | 1377 | curval = cmpxchg_futex_value_locked(uaddr, 0, newval); |
1374 | 1378 | ||
@@ -1379,7 +1383,7 @@ static int futex_lock_pi(u32 __user *uaddr, struct rw_semaphore *fshared, | |||
1379 | * Detect deadlocks. In case of REQUEUE_PI this is a valid | 1383 | * Detect deadlocks. In case of REQUEUE_PI this is a valid |
1380 | * situation and we return success to user space. | 1384 | * situation and we return success to user space. |
1381 | */ | 1385 | */ |
1382 | if (unlikely((curval & FUTEX_TID_MASK) == current->pid)) { | 1386 | if (unlikely((curval & FUTEX_TID_MASK) == task_pid_vnr(current))) { |
1383 | ret = -EDEADLK; | 1387 | ret = -EDEADLK; |
1384 | goto out_unlock_release_sem; | 1388 | goto out_unlock_release_sem; |
1385 | } | 1389 | } |
@@ -1408,7 +1412,7 @@ static int futex_lock_pi(u32 __user *uaddr, struct rw_semaphore *fshared, | |||
1408 | */ | 1412 | */ |
1409 | if (unlikely(ownerdied || !(curval & FUTEX_TID_MASK))) { | 1413 | if (unlikely(ownerdied || !(curval & FUTEX_TID_MASK))) { |
1410 | /* Keep the OWNER_DIED bit */ | 1414 | /* Keep the OWNER_DIED bit */ |
1411 | newval = (curval & ~FUTEX_TID_MASK) | current->pid; | 1415 | newval = (curval & ~FUTEX_TID_MASK) | task_pid_vnr(current); |
1412 | ownerdied = 0; | 1416 | ownerdied = 0; |
1413 | lock_taken = 1; | 1417 | lock_taken = 1; |
1414 | } | 1418 | } |
@@ -1587,7 +1591,7 @@ retry: | |||
1587 | /* | 1591 | /* |
1588 | * We release only a lock we actually own: | 1592 | * We release only a lock we actually own: |
1589 | */ | 1593 | */ |
1590 | if ((uval & FUTEX_TID_MASK) != current->pid) | 1594 | if ((uval & FUTEX_TID_MASK) != task_pid_vnr(current)) |
1591 | return -EPERM; | 1595 | return -EPERM; |
1592 | /* | 1596 | /* |
1593 | * First take all the futex related locks: | 1597 | * First take all the futex related locks: |
@@ -1608,7 +1612,7 @@ retry_unlocked: | |||
1608 | * anyone else up: | 1612 | * anyone else up: |
1609 | */ | 1613 | */ |
1610 | if (!(uval & FUTEX_OWNER_DIED)) | 1614 | if (!(uval & FUTEX_OWNER_DIED)) |
1611 | uval = cmpxchg_futex_value_locked(uaddr, current->pid, 0); | 1615 | uval = cmpxchg_futex_value_locked(uaddr, task_pid_vnr(current), 0); |
1612 | 1616 | ||
1613 | 1617 | ||
1614 | if (unlikely(uval == -EFAULT)) | 1618 | if (unlikely(uval == -EFAULT)) |
@@ -1617,7 +1621,7 @@ retry_unlocked: | |||
1617 | * Rare case: we managed to release the lock atomically, | 1621 | * Rare case: we managed to release the lock atomically, |
1618 | * no need to wake anyone else up: | 1622 | * no need to wake anyone else up: |
1619 | */ | 1623 | */ |
1620 | if (unlikely(uval == current->pid)) | 1624 | if (unlikely(uval == task_pid_vnr(current))) |
1621 | goto out_unlock; | 1625 | goto out_unlock; |
1622 | 1626 | ||
1623 | /* | 1627 | /* |
@@ -1854,7 +1858,8 @@ sys_get_robust_list(int pid, struct robust_list_head __user * __user *head_ptr, | |||
1854 | 1858 | ||
1855 | ret = -ESRCH; | 1859 | ret = -ESRCH; |
1856 | rcu_read_lock(); | 1860 | rcu_read_lock(); |
1857 | p = find_task_by_pid(pid); | 1861 | p = find_task_by_pid_ns(pid, |
1862 | current->nsproxy->pid_ns); | ||
1858 | if (!p) | 1863 | if (!p) |
1859 | goto err_unlock; | 1864 | goto err_unlock; |
1860 | ret = -EPERM; | 1865 | ret = -EPERM; |
@@ -1887,7 +1892,7 @@ retry: | |||
1887 | if (get_user(uval, uaddr)) | 1892 | if (get_user(uval, uaddr)) |
1888 | return -1; | 1893 | return -1; |
1889 | 1894 | ||
1890 | if ((uval & FUTEX_TID_MASK) == curr->pid) { | 1895 | if ((uval & FUTEX_TID_MASK) == task_pid_vnr(curr)) { |
1891 | /* | 1896 | /* |
1892 | * Ok, this dying thread is truly holding a futex | 1897 | * Ok, this dying thread is truly holding a futex |
1893 | * of interest. Set the OWNER_DIED bit atomically | 1898 | * of interest. Set the OWNER_DIED bit atomically |
diff --git a/kernel/futex_compat.c b/kernel/futex_compat.c index 2c2e2954b713..cc098e1de960 100644 --- a/kernel/futex_compat.c +++ b/kernel/futex_compat.c | |||
@@ -8,6 +8,7 @@ | |||
8 | 8 | ||
9 | #include <linux/linkage.h> | 9 | #include <linux/linkage.h> |
10 | #include <linux/compat.h> | 10 | #include <linux/compat.h> |
11 | #include <linux/nsproxy.h> | ||
11 | #include <linux/futex.h> | 12 | #include <linux/futex.h> |
12 | 13 | ||
13 | #include <asm/uaccess.h> | 14 | #include <asm/uaccess.h> |
@@ -124,7 +125,8 @@ compat_sys_get_robust_list(int pid, compat_uptr_t __user *head_ptr, | |||
124 | 125 | ||
125 | ret = -ESRCH; | 126 | ret = -ESRCH; |
126 | read_lock(&tasklist_lock); | 127 | read_lock(&tasklist_lock); |
127 | p = find_task_by_pid(pid); | 128 | p = find_task_by_pid_ns(pid, |
129 | current->nsproxy->pid_ns); | ||
128 | if (!p) | 130 | if (!p) |
129 | goto err_unlock; | 131 | goto err_unlock; |
130 | ret = -EPERM; | 132 | ret = -EPERM; |
diff --git a/kernel/ptrace.c b/kernel/ptrace.c index a73ebd3b9d4c..66e99eb2d8a6 100644 --- a/kernel/ptrace.c +++ b/kernel/ptrace.c | |||
@@ -19,6 +19,7 @@ | |||
19 | #include <linux/security.h> | 19 | #include <linux/security.h> |
20 | #include <linux/signal.h> | 20 | #include <linux/signal.h> |
21 | #include <linux/audit.h> | 21 | #include <linux/audit.h> |
22 | #include <linux/pid_namespace.h> | ||
22 | 23 | ||
23 | #include <asm/pgtable.h> | 24 | #include <asm/pgtable.h> |
24 | #include <asm/uaccess.h> | 25 | #include <asm/uaccess.h> |
@@ -443,7 +444,8 @@ struct task_struct *ptrace_get_task_struct(pid_t pid) | |||
443 | return ERR_PTR(-EPERM); | 444 | return ERR_PTR(-EPERM); |
444 | 445 | ||
445 | read_lock(&tasklist_lock); | 446 | read_lock(&tasklist_lock); |
446 | child = find_task_by_pid(pid); | 447 | child = find_task_by_pid_ns(pid, |
448 | current->nsproxy->pid_ns); | ||
447 | if (child) | 449 | if (child) |
448 | get_task_struct(child); | 450 | get_task_struct(child); |
449 | 451 | ||
diff --git a/kernel/sched.c b/kernel/sched.c index 72a2a16e2214..4ac56fe3c394 100644 --- a/kernel/sched.c +++ b/kernel/sched.c | |||
@@ -44,6 +44,7 @@ | |||
44 | #include <linux/vmalloc.h> | 44 | #include <linux/vmalloc.h> |
45 | #include <linux/blkdev.h> | 45 | #include <linux/blkdev.h> |
46 | #include <linux/delay.h> | 46 | #include <linux/delay.h> |
47 | #include <linux/pid_namespace.h> | ||
47 | #include <linux/smp.h> | 48 | #include <linux/smp.h> |
48 | #include <linux/threads.h> | 49 | #include <linux/threads.h> |
49 | #include <linux/timer.h> | 50 | #include <linux/timer.h> |
@@ -1876,7 +1877,7 @@ asmlinkage void schedule_tail(struct task_struct *prev) | |||
1876 | preempt_enable(); | 1877 | preempt_enable(); |
1877 | #endif | 1878 | #endif |
1878 | if (current->set_child_tid) | 1879 | if (current->set_child_tid) |
1879 | put_user(current->pid, current->set_child_tid); | 1880 | put_user(task_pid_vnr(current), current->set_child_tid); |
1880 | } | 1881 | } |
1881 | 1882 | ||
1882 | /* | 1883 | /* |
@@ -4167,7 +4168,8 @@ struct task_struct *idle_task(int cpu) | |||
4167 | */ | 4168 | */ |
4168 | static struct task_struct *find_process_by_pid(pid_t pid) | 4169 | static struct task_struct *find_process_by_pid(pid_t pid) |
4169 | { | 4170 | { |
4170 | return pid ? find_task_by_pid(pid) : current; | 4171 | return pid ? |
4172 | find_task_by_pid_ns(pid, current->nsproxy->pid_ns) : current; | ||
4171 | } | 4173 | } |
4172 | 4174 | ||
4173 | /* Actually do priority change: must hold rq lock. */ | 4175 | /* Actually do priority change: must hold rq lock. */ |
diff --git a/kernel/signal.c b/kernel/signal.c index 98923882ba57..d809cdd6c0f1 100644 --- a/kernel/signal.c +++ b/kernel/signal.c | |||
@@ -694,7 +694,7 @@ static int send_signal(int sig, struct siginfo *info, struct task_struct *t, | |||
694 | q->info.si_signo = sig; | 694 | q->info.si_signo = sig; |
695 | q->info.si_errno = 0; | 695 | q->info.si_errno = 0; |
696 | q->info.si_code = SI_USER; | 696 | q->info.si_code = SI_USER; |
697 | q->info.si_pid = current->pid; | 697 | q->info.si_pid = task_pid_vnr(current); |
698 | q->info.si_uid = current->uid; | 698 | q->info.si_uid = current->uid; |
699 | break; | 699 | break; |
700 | case (unsigned long) SEND_SIG_PRIV: | 700 | case (unsigned long) SEND_SIG_PRIV: |
@@ -1089,7 +1089,7 @@ kill_proc_info(int sig, struct siginfo *info, pid_t pid) | |||
1089 | { | 1089 | { |
1090 | int error; | 1090 | int error; |
1091 | rcu_read_lock(); | 1091 | rcu_read_lock(); |
1092 | error = kill_pid_info(sig, info, find_pid(pid)); | 1092 | error = kill_pid_info(sig, info, find_vpid(pid)); |
1093 | rcu_read_unlock(); | 1093 | rcu_read_unlock(); |
1094 | return error; | 1094 | return error; |
1095 | } | 1095 | } |
@@ -1160,9 +1160,9 @@ static int kill_something_info(int sig, struct siginfo *info, int pid) | |||
1160 | read_unlock(&tasklist_lock); | 1160 | read_unlock(&tasklist_lock); |
1161 | ret = count ? retval : -ESRCH; | 1161 | ret = count ? retval : -ESRCH; |
1162 | } else if (pid < 0) { | 1162 | } else if (pid < 0) { |
1163 | ret = kill_pgrp_info(sig, info, find_pid(-pid)); | 1163 | ret = kill_pgrp_info(sig, info, find_vpid(-pid)); |
1164 | } else { | 1164 | } else { |
1165 | ret = kill_pid_info(sig, info, find_pid(pid)); | 1165 | ret = kill_pid_info(sig, info, find_vpid(pid)); |
1166 | } | 1166 | } |
1167 | rcu_read_unlock(); | 1167 | rcu_read_unlock(); |
1168 | return ret; | 1168 | return ret; |
@@ -1266,7 +1266,12 @@ EXPORT_SYMBOL(kill_pid); | |||
1266 | int | 1266 | int |
1267 | kill_proc(pid_t pid, int sig, int priv) | 1267 | kill_proc(pid_t pid, int sig, int priv) |
1268 | { | 1268 | { |
1269 | return kill_proc_info(sig, __si_special(priv), pid); | 1269 | int ret; |
1270 | |||
1271 | rcu_read_lock(); | ||
1272 | ret = kill_pid_info(sig, __si_special(priv), find_pid(pid)); | ||
1273 | rcu_read_unlock(); | ||
1274 | return ret; | ||
1270 | } | 1275 | } |
1271 | 1276 | ||
1272 | /* | 1277 | /* |
@@ -1443,7 +1448,22 @@ void do_notify_parent(struct task_struct *tsk, int sig) | |||
1443 | 1448 | ||
1444 | info.si_signo = sig; | 1449 | info.si_signo = sig; |
1445 | info.si_errno = 0; | 1450 | info.si_errno = 0; |
1446 | info.si_pid = tsk->pid; | 1451 | /* |
1452 | * we are under tasklist_lock here so our parent is tied to | ||
1453 | * us and cannot exit and release its namespace. | ||
1454 | * | ||
1455 | * the only it can is to switch its nsproxy with sys_unshare, | ||
1456 | * bu uncharing pid namespaces is not allowed, so we'll always | ||
1457 | * see relevant namespace | ||
1458 | * | ||
1459 | * write_lock() currently calls preempt_disable() which is the | ||
1460 | * same as rcu_read_lock(), but according to Oleg, this is not | ||
1461 | * correct to rely on this | ||
1462 | */ | ||
1463 | rcu_read_lock(); | ||
1464 | info.si_pid = task_pid_nr_ns(tsk, tsk->parent->nsproxy->pid_ns); | ||
1465 | rcu_read_unlock(); | ||
1466 | |||
1447 | info.si_uid = tsk->uid; | 1467 | info.si_uid = tsk->uid; |
1448 | 1468 | ||
1449 | /* FIXME: find out whether or not this is supposed to be c*time. */ | 1469 | /* FIXME: find out whether or not this is supposed to be c*time. */ |
@@ -1508,7 +1528,13 @@ static void do_notify_parent_cldstop(struct task_struct *tsk, int why) | |||
1508 | 1528 | ||
1509 | info.si_signo = SIGCHLD; | 1529 | info.si_signo = SIGCHLD; |
1510 | info.si_errno = 0; | 1530 | info.si_errno = 0; |
1511 | info.si_pid = tsk->pid; | 1531 | /* |
1532 | * see comment in do_notify_parent() abot the following 3 lines | ||
1533 | */ | ||
1534 | rcu_read_lock(); | ||
1535 | info.si_pid = task_pid_nr_ns(tsk, tsk->parent->nsproxy->pid_ns); | ||
1536 | rcu_read_unlock(); | ||
1537 | |||
1512 | info.si_uid = tsk->uid; | 1538 | info.si_uid = tsk->uid; |
1513 | 1539 | ||
1514 | /* FIXME: find out whether or not this is supposed to be c*time. */ | 1540 | /* FIXME: find out whether or not this is supposed to be c*time. */ |
@@ -1634,7 +1660,7 @@ void ptrace_notify(int exit_code) | |||
1634 | memset(&info, 0, sizeof info); | 1660 | memset(&info, 0, sizeof info); |
1635 | info.si_signo = SIGTRAP; | 1661 | info.si_signo = SIGTRAP; |
1636 | info.si_code = exit_code; | 1662 | info.si_code = exit_code; |
1637 | info.si_pid = current->pid; | 1663 | info.si_pid = task_pid_vnr(current); |
1638 | info.si_uid = current->uid; | 1664 | info.si_uid = current->uid; |
1639 | 1665 | ||
1640 | /* Let the debugger run. */ | 1666 | /* Let the debugger run. */ |
@@ -1804,7 +1830,7 @@ relock: | |||
1804 | info->si_signo = signr; | 1830 | info->si_signo = signr; |
1805 | info->si_errno = 0; | 1831 | info->si_errno = 0; |
1806 | info->si_code = SI_USER; | 1832 | info->si_code = SI_USER; |
1807 | info->si_pid = current->parent->pid; | 1833 | info->si_pid = task_pid_vnr(current->parent); |
1808 | info->si_uid = current->parent->uid; | 1834 | info->si_uid = current->parent->uid; |
1809 | } | 1835 | } |
1810 | 1836 | ||
@@ -2191,7 +2217,7 @@ sys_kill(int pid, int sig) | |||
2191 | info.si_signo = sig; | 2217 | info.si_signo = sig; |
2192 | info.si_errno = 0; | 2218 | info.si_errno = 0; |
2193 | info.si_code = SI_USER; | 2219 | info.si_code = SI_USER; |
2194 | info.si_pid = current->tgid; | 2220 | info.si_pid = task_tgid_vnr(current); |
2195 | info.si_uid = current->uid; | 2221 | info.si_uid = current->uid; |
2196 | 2222 | ||
2197 | return kill_something_info(sig, &info, pid); | 2223 | return kill_something_info(sig, &info, pid); |
@@ -2207,12 +2233,12 @@ static int do_tkill(int tgid, int pid, int sig) | |||
2207 | info.si_signo = sig; | 2233 | info.si_signo = sig; |
2208 | info.si_errno = 0; | 2234 | info.si_errno = 0; |
2209 | info.si_code = SI_TKILL; | 2235 | info.si_code = SI_TKILL; |
2210 | info.si_pid = current->tgid; | 2236 | info.si_pid = task_tgid_vnr(current); |
2211 | info.si_uid = current->uid; | 2237 | info.si_uid = current->uid; |
2212 | 2238 | ||
2213 | read_lock(&tasklist_lock); | 2239 | read_lock(&tasklist_lock); |
2214 | p = find_task_by_pid(pid); | 2240 | p = find_task_by_pid_ns(pid, current->nsproxy->pid_ns); |
2215 | if (p && (tgid <= 0 || p->tgid == tgid)) { | 2241 | if (p && (tgid <= 0 || task_tgid_vnr(p) == tgid)) { |
2216 | error = check_kill_permission(sig, &info, p); | 2242 | error = check_kill_permission(sig, &info, p); |
2217 | /* | 2243 | /* |
2218 | * The null signal is a permissions and process existence | 2244 | * The null signal is a permissions and process existence |
diff --git a/kernel/sys.c b/kernel/sys.c index 4cfa213a5ac2..23620d52cf37 100644 --- a/kernel/sys.c +++ b/kernel/sys.c | |||
@@ -152,7 +152,8 @@ asmlinkage long sys_setpriority(int which, int who, int niceval) | |||
152 | switch (which) { | 152 | switch (which) { |
153 | case PRIO_PROCESS: | 153 | case PRIO_PROCESS: |
154 | if (who) | 154 | if (who) |
155 | p = find_task_by_pid(who); | 155 | p = find_task_by_pid_ns(who, |
156 | current->nsproxy->pid_ns); | ||
156 | else | 157 | else |
157 | p = current; | 158 | p = current; |
158 | if (p) | 159 | if (p) |
@@ -160,7 +161,7 @@ asmlinkage long sys_setpriority(int which, int who, int niceval) | |||
160 | break; | 161 | break; |
161 | case PRIO_PGRP: | 162 | case PRIO_PGRP: |
162 | if (who) | 163 | if (who) |
163 | pgrp = find_pid(who); | 164 | pgrp = find_vpid(who); |
164 | else | 165 | else |
165 | pgrp = task_pgrp(current); | 166 | pgrp = task_pgrp(current); |
166 | do_each_pid_task(pgrp, PIDTYPE_PGID, p) { | 167 | do_each_pid_task(pgrp, PIDTYPE_PGID, p) { |
@@ -209,7 +210,8 @@ asmlinkage long sys_getpriority(int which, int who) | |||
209 | switch (which) { | 210 | switch (which) { |
210 | case PRIO_PROCESS: | 211 | case PRIO_PROCESS: |
211 | if (who) | 212 | if (who) |
212 | p = find_task_by_pid(who); | 213 | p = find_task_by_pid_ns(who, |
214 | current->nsproxy->pid_ns); | ||
213 | else | 215 | else |
214 | p = current; | 216 | p = current; |
215 | if (p) { | 217 | if (p) { |
@@ -220,7 +222,7 @@ asmlinkage long sys_getpriority(int which, int who) | |||
220 | break; | 222 | break; |
221 | case PRIO_PGRP: | 223 | case PRIO_PGRP: |
222 | if (who) | 224 | if (who) |
223 | pgrp = find_pid(who); | 225 | pgrp = find_vpid(who); |
224 | else | 226 | else |
225 | pgrp = task_pgrp(current); | 227 | pgrp = task_pgrp(current); |
226 | do_each_pid_task(pgrp, PIDTYPE_PGID, p) { | 228 | do_each_pid_task(pgrp, PIDTYPE_PGID, p) { |
@@ -917,9 +919,10 @@ asmlinkage long sys_setpgid(pid_t pid, pid_t pgid) | |||
917 | struct task_struct *p; | 919 | struct task_struct *p; |
918 | struct task_struct *group_leader = current->group_leader; | 920 | struct task_struct *group_leader = current->group_leader; |
919 | int err = -EINVAL; | 921 | int err = -EINVAL; |
922 | struct pid_namespace *ns; | ||
920 | 923 | ||
921 | if (!pid) | 924 | if (!pid) |
922 | pid = group_leader->pid; | 925 | pid = task_pid_vnr(group_leader); |
923 | if (!pgid) | 926 | if (!pgid) |
924 | pgid = pid; | 927 | pgid = pid; |
925 | if (pgid < 0) | 928 | if (pgid < 0) |
@@ -928,10 +931,12 @@ asmlinkage long sys_setpgid(pid_t pid, pid_t pgid) | |||
928 | /* From this point forward we keep holding onto the tasklist lock | 931 | /* From this point forward we keep holding onto the tasklist lock |
929 | * so that our parent does not change from under us. -DaveM | 932 | * so that our parent does not change from under us. -DaveM |
930 | */ | 933 | */ |
934 | ns = current->nsproxy->pid_ns; | ||
935 | |||
931 | write_lock_irq(&tasklist_lock); | 936 | write_lock_irq(&tasklist_lock); |
932 | 937 | ||
933 | err = -ESRCH; | 938 | err = -ESRCH; |
934 | p = find_task_by_pid(pid); | 939 | p = find_task_by_pid_ns(pid, ns); |
935 | if (!p) | 940 | if (!p) |
936 | goto out; | 941 | goto out; |
937 | 942 | ||
@@ -957,9 +962,9 @@ asmlinkage long sys_setpgid(pid_t pid, pid_t pgid) | |||
957 | goto out; | 962 | goto out; |
958 | 963 | ||
959 | if (pgid != pid) { | 964 | if (pgid != pid) { |
960 | struct task_struct *g = | 965 | struct task_struct *g; |
961 | find_task_by_pid_type(PIDTYPE_PGID, pgid); | ||
962 | 966 | ||
967 | g = find_task_by_pid_type_ns(PIDTYPE_PGID, pgid, ns); | ||
963 | if (!g || task_session(g) != task_session(group_leader)) | 968 | if (!g || task_session(g) != task_session(group_leader)) |
964 | goto out; | 969 | goto out; |
965 | } | 970 | } |
@@ -968,10 +973,13 @@ asmlinkage long sys_setpgid(pid_t pid, pid_t pgid) | |||
968 | if (err) | 973 | if (err) |
969 | goto out; | 974 | goto out; |
970 | 975 | ||
971 | if (task_pgrp_nr(p) != pgid) { | 976 | if (task_pgrp_nr_ns(p, ns) != pgid) { |
977 | struct pid *pid; | ||
978 | |||
972 | detach_pid(p, PIDTYPE_PGID); | 979 | detach_pid(p, PIDTYPE_PGID); |
973 | p->signal->pgrp = pgid; | 980 | pid = find_vpid(pgid); |
974 | attach_pid(p, PIDTYPE_PGID, find_pid(pgid)); | 981 | attach_pid(p, PIDTYPE_PGID, pid); |
982 | p->signal->pgrp = pid_nr(pid); | ||
975 | } | 983 | } |
976 | 984 | ||
977 | err = 0; | 985 | err = 0; |
@@ -984,19 +992,21 @@ out: | |||
984 | asmlinkage long sys_getpgid(pid_t pid) | 992 | asmlinkage long sys_getpgid(pid_t pid) |
985 | { | 993 | { |
986 | if (!pid) | 994 | if (!pid) |
987 | return task_pgrp_nr(current); | 995 | return task_pgrp_vnr(current); |
988 | else { | 996 | else { |
989 | int retval; | 997 | int retval; |
990 | struct task_struct *p; | 998 | struct task_struct *p; |
999 | struct pid_namespace *ns; | ||
991 | 1000 | ||
992 | read_lock(&tasklist_lock); | 1001 | ns = current->nsproxy->pid_ns; |
993 | p = find_task_by_pid(pid); | ||
994 | 1002 | ||
1003 | read_lock(&tasklist_lock); | ||
1004 | p = find_task_by_pid_ns(pid, ns); | ||
995 | retval = -ESRCH; | 1005 | retval = -ESRCH; |
996 | if (p) { | 1006 | if (p) { |
997 | retval = security_task_getpgid(p); | 1007 | retval = security_task_getpgid(p); |
998 | if (!retval) | 1008 | if (!retval) |
999 | retval = task_pgrp_nr(p); | 1009 | retval = task_pgrp_nr_ns(p, ns); |
1000 | } | 1010 | } |
1001 | read_unlock(&tasklist_lock); | 1011 | read_unlock(&tasklist_lock); |
1002 | return retval; | 1012 | return retval; |
@@ -1008,7 +1018,7 @@ asmlinkage long sys_getpgid(pid_t pid) | |||
1008 | asmlinkage long sys_getpgrp(void) | 1018 | asmlinkage long sys_getpgrp(void) |
1009 | { | 1019 | { |
1010 | /* SMP - assuming writes are word atomic this is fine */ | 1020 | /* SMP - assuming writes are word atomic this is fine */ |
1011 | return task_pgrp_nr(current); | 1021 | return task_pgrp_vnr(current); |
1012 | } | 1022 | } |
1013 | 1023 | ||
1014 | #endif | 1024 | #endif |
@@ -1016,19 +1026,21 @@ asmlinkage long sys_getpgrp(void) | |||
1016 | asmlinkage long sys_getsid(pid_t pid) | 1026 | asmlinkage long sys_getsid(pid_t pid) |
1017 | { | 1027 | { |
1018 | if (!pid) | 1028 | if (!pid) |
1019 | return task_session_nr(current); | 1029 | return task_session_vnr(current); |
1020 | else { | 1030 | else { |
1021 | int retval; | 1031 | int retval; |
1022 | struct task_struct *p; | 1032 | struct task_struct *p; |
1033 | struct pid_namespace *ns; | ||
1023 | 1034 | ||
1024 | read_lock(&tasklist_lock); | 1035 | ns = current->nsproxy->pid_ns; |
1025 | p = find_task_by_pid(pid); | ||
1026 | 1036 | ||
1037 | read_lock(&tasklist_lock); | ||
1038 | p = find_task_by_pid_ns(pid, ns); | ||
1027 | retval = -ESRCH; | 1039 | retval = -ESRCH; |
1028 | if (p) { | 1040 | if (p) { |
1029 | retval = security_task_getsid(p); | 1041 | retval = security_task_getsid(p); |
1030 | if (!retval) | 1042 | if (!retval) |
1031 | retval = task_session_nr(p); | 1043 | retval = task_session_nr_ns(p, ns); |
1032 | } | 1044 | } |
1033 | read_unlock(&tasklist_lock); | 1045 | read_unlock(&tasklist_lock); |
1034 | return retval; | 1046 | return retval; |
@@ -1065,7 +1077,7 @@ asmlinkage long sys_setsid(void) | |||
1065 | group_leader->signal->tty = NULL; | 1077 | group_leader->signal->tty = NULL; |
1066 | spin_unlock(&group_leader->sighand->siglock); | 1078 | spin_unlock(&group_leader->sighand->siglock); |
1067 | 1079 | ||
1068 | err = task_pgrp_nr(group_leader); | 1080 | err = task_pgrp_vnr(group_leader); |
1069 | out: | 1081 | out: |
1070 | write_unlock_irq(&tasklist_lock); | 1082 | write_unlock_irq(&tasklist_lock); |
1071 | return err; | 1083 | return err; |
diff --git a/kernel/sysctl.c b/kernel/sysctl.c index 44868e4df1d3..3b4efbe26445 100644 --- a/kernel/sysctl.c +++ b/kernel/sysctl.c | |||
@@ -2278,7 +2278,7 @@ static int proc_do_cad_pid(struct ctl_table *table, int write, struct file *filp | |||
2278 | pid_t tmp; | 2278 | pid_t tmp; |
2279 | int r; | 2279 | int r; |
2280 | 2280 | ||
2281 | tmp = pid_nr(cad_pid); | 2281 | tmp = pid_nr_ns(cad_pid, current->nsproxy->pid_ns); |
2282 | 2282 | ||
2283 | r = __do_proc_dointvec(&tmp, table, write, filp, buffer, | 2283 | r = __do_proc_dointvec(&tmp, table, write, filp, buffer, |
2284 | lenp, ppos, NULL, NULL); | 2284 | lenp, ppos, NULL, NULL); |
diff --git a/kernel/timer.c b/kernel/timer.c index 8521d10fbb27..fb4e67d5dd60 100644 --- a/kernel/timer.c +++ b/kernel/timer.c | |||
@@ -26,6 +26,7 @@ | |||
26 | #include <linux/init.h> | 26 | #include <linux/init.h> |
27 | #include <linux/mm.h> | 27 | #include <linux/mm.h> |
28 | #include <linux/swap.h> | 28 | #include <linux/swap.h> |
29 | #include <linux/pid_namespace.h> | ||
29 | #include <linux/notifier.h> | 30 | #include <linux/notifier.h> |
30 | #include <linux/thread_info.h> | 31 | #include <linux/thread_info.h> |
31 | #include <linux/time.h> | 32 | #include <linux/time.h> |
@@ -956,7 +957,7 @@ asmlinkage unsigned long sys_alarm(unsigned int seconds) | |||
956 | */ | 957 | */ |
957 | asmlinkage long sys_getpid(void) | 958 | asmlinkage long sys_getpid(void) |
958 | { | 959 | { |
959 | return current->tgid; | 960 | return task_tgid_vnr(current); |
960 | } | 961 | } |
961 | 962 | ||
962 | /* | 963 | /* |
@@ -970,7 +971,7 @@ asmlinkage long sys_getppid(void) | |||
970 | int pid; | 971 | int pid; |
971 | 972 | ||
972 | rcu_read_lock(); | 973 | rcu_read_lock(); |
973 | pid = rcu_dereference(current->real_parent)->tgid; | 974 | pid = task_ppid_nr_ns(current, current->nsproxy->pid_ns); |
974 | rcu_read_unlock(); | 975 | rcu_read_unlock(); |
975 | 976 | ||
976 | return pid; | 977 | return pid; |
@@ -1102,7 +1103,7 @@ EXPORT_SYMBOL(schedule_timeout_uninterruptible); | |||
1102 | /* Thread ID - the internal kernel "pid" */ | 1103 | /* Thread ID - the internal kernel "pid" */ |
1103 | asmlinkage long sys_gettid(void) | 1104 | asmlinkage long sys_gettid(void) |
1104 | { | 1105 | { |
1105 | return current->pid; | 1106 | return task_pid_vnr(current); |
1106 | } | 1107 | } |
1107 | 1108 | ||
1108 | /** | 1109 | /** |