diff options
Diffstat (limited to 'drivers/char/tty_io.c')
-rw-r--r-- | drivers/char/tty_io.c | 24 |
1 files changed, 17 insertions, 7 deletions
diff --git a/drivers/char/tty_io.c b/drivers/char/tty_io.c index abfe24d28c51..95f3596189cf 100644 --- a/drivers/char/tty_io.c +++ b/drivers/char/tty_io.c | |||
@@ -2990,7 +2990,8 @@ static int tiocgpgrp(struct tty_struct *tty, struct tty_struct *real_tty, pid_t | |||
2990 | 2990 | ||
2991 | static int tiocspgrp(struct tty_struct *tty, struct tty_struct *real_tty, pid_t __user *p) | 2991 | static int tiocspgrp(struct tty_struct *tty, struct tty_struct *real_tty, pid_t __user *p) |
2992 | { | 2992 | { |
2993 | pid_t pgrp; | 2993 | struct pid *pgrp; |
2994 | pid_t pgrp_nr; | ||
2994 | int retval = tty_check_change(real_tty); | 2995 | int retval = tty_check_change(real_tty); |
2995 | 2996 | ||
2996 | if (retval == -EIO) | 2997 | if (retval == -EIO) |
@@ -3001,14 +3002,23 @@ static int tiocspgrp(struct tty_struct *tty, struct tty_struct *real_tty, pid_t | |||
3001 | (current->signal->tty != real_tty) || | 3002 | (current->signal->tty != real_tty) || |
3002 | (real_tty->session != process_session(current))) | 3003 | (real_tty->session != process_session(current))) |
3003 | return -ENOTTY; | 3004 | return -ENOTTY; |
3004 | if (get_user(pgrp, p)) | 3005 | if (get_user(pgrp_nr, p)) |
3005 | return -EFAULT; | 3006 | return -EFAULT; |
3006 | if (pgrp < 0) | 3007 | if (pgrp_nr < 0) |
3007 | return -EINVAL; | 3008 | return -EINVAL; |
3008 | if (session_of_pgrp(pgrp) != process_session(current)) | 3009 | rcu_read_lock(); |
3009 | return -EPERM; | 3010 | pgrp = find_pid(pgrp_nr); |
3010 | real_tty->pgrp = pgrp; | 3011 | retval = -ESRCH; |
3011 | return 0; | 3012 | if (!pgrp) |
3013 | goto out_unlock; | ||
3014 | retval = -EPERM; | ||
3015 | if (session_of_pgrp(pgrp) != task_session(current)) | ||
3016 | goto out_unlock; | ||
3017 | retval = 0; | ||
3018 | real_tty->pgrp = pgrp_nr; | ||
3019 | out_unlock: | ||
3020 | rcu_read_unlock(); | ||
3021 | return retval; | ||
3012 | } | 3022 | } |
3013 | 3023 | ||
3014 | /** | 3024 | /** |