diff options
Diffstat (limited to 'kernel/sys.c')
-rw-r--r-- | kernel/sys.c | 79 |
1 files changed, 43 insertions, 36 deletions
diff --git a/kernel/sys.c b/kernel/sys.c index e423d0d9e6ff..895d2d4c9493 100644 --- a/kernel/sys.c +++ b/kernel/sys.c | |||
@@ -978,8 +978,7 @@ asmlinkage long sys_setpgid(pid_t pid, pid_t pgid) | |||
978 | goto out; | 978 | goto out; |
979 | 979 | ||
980 | if (task_pgrp(p) != pgrp) { | 980 | if (task_pgrp(p) != pgrp) { |
981 | detach_pid(p, PIDTYPE_PGID); | 981 | change_pid(p, PIDTYPE_PGID, pgrp); |
982 | attach_pid(p, PIDTYPE_PGID, pgrp); | ||
983 | set_task_pgrp(p, pid_nr(pgrp)); | 982 | set_task_pgrp(p, pid_nr(pgrp)); |
984 | } | 983 | } |
985 | 984 | ||
@@ -992,54 +991,67 @@ out: | |||
992 | 991 | ||
993 | asmlinkage long sys_getpgid(pid_t pid) | 992 | asmlinkage long sys_getpgid(pid_t pid) |
994 | { | 993 | { |
994 | struct task_struct *p; | ||
995 | struct pid *grp; | ||
996 | int retval; | ||
997 | |||
998 | rcu_read_lock(); | ||
995 | if (!pid) | 999 | if (!pid) |
996 | return task_pgrp_vnr(current); | 1000 | grp = task_pgrp(current); |
997 | else { | 1001 | else { |
998 | int retval; | ||
999 | struct task_struct *p; | ||
1000 | |||
1001 | read_lock(&tasklist_lock); | ||
1002 | p = find_task_by_vpid(pid); | ||
1003 | retval = -ESRCH; | 1002 | retval = -ESRCH; |
1004 | if (p) { | 1003 | p = find_task_by_vpid(pid); |
1005 | retval = security_task_getpgid(p); | 1004 | if (!p) |
1006 | if (!retval) | 1005 | goto out; |
1007 | retval = task_pgrp_vnr(p); | 1006 | grp = task_pgrp(p); |
1008 | } | 1007 | if (!grp) |
1009 | read_unlock(&tasklist_lock); | 1008 | goto out; |
1010 | return retval; | 1009 | |
1010 | retval = security_task_getpgid(p); | ||
1011 | if (retval) | ||
1012 | goto out; | ||
1011 | } | 1013 | } |
1014 | retval = pid_vnr(grp); | ||
1015 | out: | ||
1016 | rcu_read_unlock(); | ||
1017 | return retval; | ||
1012 | } | 1018 | } |
1013 | 1019 | ||
1014 | #ifdef __ARCH_WANT_SYS_GETPGRP | 1020 | #ifdef __ARCH_WANT_SYS_GETPGRP |
1015 | 1021 | ||
1016 | asmlinkage long sys_getpgrp(void) | 1022 | asmlinkage long sys_getpgrp(void) |
1017 | { | 1023 | { |
1018 | /* SMP - assuming writes are word atomic this is fine */ | 1024 | return sys_getpgid(0); |
1019 | return task_pgrp_vnr(current); | ||
1020 | } | 1025 | } |
1021 | 1026 | ||
1022 | #endif | 1027 | #endif |
1023 | 1028 | ||
1024 | asmlinkage long sys_getsid(pid_t pid) | 1029 | asmlinkage long sys_getsid(pid_t pid) |
1025 | { | 1030 | { |
1031 | struct task_struct *p; | ||
1032 | struct pid *sid; | ||
1033 | int retval; | ||
1034 | |||
1035 | rcu_read_lock(); | ||
1026 | if (!pid) | 1036 | if (!pid) |
1027 | return task_session_vnr(current); | 1037 | sid = task_session(current); |
1028 | else { | 1038 | else { |
1029 | int retval; | ||
1030 | struct task_struct *p; | ||
1031 | |||
1032 | rcu_read_lock(); | ||
1033 | p = find_task_by_vpid(pid); | ||
1034 | retval = -ESRCH; | 1039 | retval = -ESRCH; |
1035 | if (p) { | 1040 | p = find_task_by_vpid(pid); |
1036 | retval = security_task_getsid(p); | 1041 | if (!p) |
1037 | if (!retval) | 1042 | goto out; |
1038 | retval = task_session_vnr(p); | 1043 | sid = task_session(p); |
1039 | } | 1044 | if (!sid) |
1040 | rcu_read_unlock(); | 1045 | goto out; |
1041 | return retval; | 1046 | |
1047 | retval = security_task_getsid(p); | ||
1048 | if (retval) | ||
1049 | goto out; | ||
1042 | } | 1050 | } |
1051 | retval = pid_vnr(sid); | ||
1052 | out: | ||
1053 | rcu_read_unlock(); | ||
1054 | return retval; | ||
1043 | } | 1055 | } |
1044 | 1056 | ||
1045 | asmlinkage long sys_setsid(void) | 1057 | asmlinkage long sys_setsid(void) |
@@ -1572,11 +1584,8 @@ static void k_getrusage(struct task_struct *p, int who, struct rusage *r) | |||
1572 | goto out; | 1584 | goto out; |
1573 | } | 1585 | } |
1574 | 1586 | ||
1575 | rcu_read_lock(); | 1587 | if (!lock_task_sighand(p, &flags)) |
1576 | if (!lock_task_sighand(p, &flags)) { | ||
1577 | rcu_read_unlock(); | ||
1578 | return; | 1588 | return; |
1579 | } | ||
1580 | 1589 | ||
1581 | switch (who) { | 1590 | switch (who) { |
1582 | case RUSAGE_BOTH: | 1591 | case RUSAGE_BOTH: |
@@ -1612,9 +1621,7 @@ static void k_getrusage(struct task_struct *p, int who, struct rusage *r) | |||
1612 | default: | 1621 | default: |
1613 | BUG(); | 1622 | BUG(); |
1614 | } | 1623 | } |
1615 | |||
1616 | unlock_task_sighand(p, &flags); | 1624 | unlock_task_sighand(p, &flags); |
1617 | rcu_read_unlock(); | ||
1618 | 1625 | ||
1619 | out: | 1626 | out: |
1620 | cputime_to_timeval(utime, &r->ru_utime); | 1627 | cputime_to_timeval(utime, &r->ru_utime); |