diff options
Diffstat (limited to 'kernel/sys.c')
-rw-r--r-- | kernel/sys.c | 54 |
1 files changed, 33 insertions, 21 deletions
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; |