From 6890ade9a0f2c360dbc86f39afc1ef852f4a83c6 Mon Sep 17 00:00:00 2001 From: Al Viro Date: Mon, 10 Sep 2018 17:47:19 -0400 Subject: [PATCH] saner tty_mode_ioctl() prototype Pass arg as void __user * and don't bother with file at all. Callers adjusted. Signed-off-by: Al Viro --- drivers/net/can/can327.c | 2 +- drivers/net/can/slcan/slcan-core.c | 2 +- drivers/net/hamradio/6pack.c | 2 +- drivers/net/ppp/ppp_async.c | 2 +- drivers/net/ppp/ppp_synctty.c | 2 +- drivers/net/slip/slip.c | 2 +- drivers/tty/tty_ioctl.c | 53 ++++++++++++++---------------- include/linux/tty.h | 2 +- 8 files changed, 32 insertions(+), 35 deletions(-) diff --git a/drivers/net/can/can327.c b/drivers/net/can/can327.c index 0aa1af31d0fe4..cf64e639669af 100644 --- a/drivers/net/can/can327.c +++ b/drivers/net/can/can327.c @@ -1101,7 +1101,7 @@ static int can327_ldisc_ioctl(struct tty_struct *tty, unsigned int cmd, return -EINVAL; default: - return tty_mode_ioctl(tty, cmd, arg); + return tty_mode_ioctl(tty, cmd, (void __user *)arg); } } diff --git a/drivers/net/can/slcan/slcan-core.c b/drivers/net/can/slcan/slcan-core.c index 8d13fdf8c28a4..27472448483be 100644 --- a/drivers/net/can/slcan/slcan-core.c +++ b/drivers/net/can/slcan/slcan-core.c @@ -898,7 +898,7 @@ static int slcan_ioctl(struct tty_struct *tty, unsigned int cmd, return -EINVAL; default: - return tty_mode_ioctl(tty, cmd, arg); + return tty_mode_ioctl(tty, cmd, (void __user *)arg); } } diff --git a/drivers/net/hamradio/6pack.c b/drivers/net/hamradio/6pack.c index 9fb5675242207..8da05c5d8e234 100644 --- a/drivers/net/hamradio/6pack.c +++ b/drivers/net/hamradio/6pack.c @@ -735,7 +735,7 @@ static int sixpack_ioctl(struct tty_struct *tty, unsigned int cmd, break; } default: - err = tty_mode_ioctl(tty, cmd, arg); + err = tty_mode_ioctl(tty, cmd, (void __user *)arg); } sp_put(sp); diff --git a/drivers/net/ppp/ppp_async.c b/drivers/net/ppp/ppp_async.c index 15a179631903f..9dd48707b03a6 100644 --- a/drivers/net/ppp/ppp_async.c +++ b/drivers/net/ppp/ppp_async.c @@ -321,7 +321,7 @@ ppp_asynctty_ioctl(struct tty_struct *tty, unsigned int cmd, unsigned long arg) default: /* Try the various mode ioctls */ - err = tty_mode_ioctl(tty, cmd, arg); + err = tty_mode_ioctl(tty, cmd, (void __user *)arg); } ap_put(ap); diff --git a/drivers/net/ppp/ppp_synctty.c b/drivers/net/ppp/ppp_synctty.c index 18283b7b94bcd..4404c6f50512c 100644 --- a/drivers/net/ppp/ppp_synctty.c +++ b/drivers/net/ppp/ppp_synctty.c @@ -313,7 +313,7 @@ ppp_synctty_ioctl(struct tty_struct *tty, unsigned int cmd, unsigned long arg) break; default: - err = tty_mode_ioctl(tty, cmd, arg); + err = tty_mode_ioctl(tty, cmd, (void __user *)arg); break; } diff --git a/drivers/net/slip/slip.c b/drivers/net/slip/slip.c index 6865d32270e5d..9f083dc603560 100644 --- a/drivers/net/slip/slip.c +++ b/drivers/net/slip/slip.c @@ -1173,7 +1173,7 @@ static int slip_ioctl(struct tty_struct *tty, unsigned int cmd, /* VSV changes end */ #endif default: - return tty_mode_ioctl(tty, cmd, arg); + return tty_mode_ioctl(tty, cmd, (void __user *)arg); } } diff --git a/drivers/tty/tty_ioctl.c b/drivers/tty/tty_ioctl.c index ce511557b98b1..281e5800b065b 100644 --- a/drivers/tty/tty_ioctl.c +++ b/drivers/tty/tty_ioctl.c @@ -760,10 +760,9 @@ static int tty_change_softcar(struct tty_struct *tty, int arg) * consistent mode setting. */ -int tty_mode_ioctl(struct tty_struct *tty, unsigned int cmd, unsigned long arg) +int tty_mode_ioctl(struct tty_struct *tty, unsigned int cmd, void __user *arg) { struct tty_struct *real_tty; - void __user *p = (void __user *)arg; int ret = 0; struct ktermios kterm; @@ -776,73 +775,72 @@ int tty_mode_ioctl(struct tty_struct *tty, unsigned int cmd, unsigned long arg) switch (cmd) { #ifdef TIOCGETP case TIOCGETP: - return get_sgttyb(real_tty, (struct sgttyb __user *) arg); + return get_sgttyb(real_tty, arg); case TIOCSETP: case TIOCSETN: - return set_sgttyb(real_tty, (struct sgttyb __user *) arg); + return set_sgttyb(real_tty, arg); #endif #ifdef TIOCGETC case TIOCGETC: - return get_tchars(real_tty, p); + return get_tchars(real_tty, arg); case TIOCSETC: - return set_tchars(real_tty, p); + return set_tchars(real_tty, arg); #endif #ifdef TIOCGLTC case TIOCGLTC: - return get_ltchars(real_tty, p); + return get_ltchars(real_tty, arg); case TIOCSLTC: - return set_ltchars(real_tty, p); + return set_ltchars(real_tty, arg); #endif case TCSETSF: - return set_termios(real_tty, p, TERMIOS_FLUSH | TERMIOS_WAIT | TERMIOS_OLD); + return set_termios(real_tty, arg, TERMIOS_FLUSH | TERMIOS_WAIT | TERMIOS_OLD); case TCSETSW: - return set_termios(real_tty, p, TERMIOS_WAIT | TERMIOS_OLD); + return set_termios(real_tty, arg, TERMIOS_WAIT | TERMIOS_OLD); case TCSETS: - return set_termios(real_tty, p, TERMIOS_OLD); + return set_termios(real_tty, arg, TERMIOS_OLD); #ifndef TCGETS2 case TCGETS: copy_termios(real_tty, &kterm); - if (kernel_termios_to_user_termios((struct termios __user *)arg, &kterm)) + if (kernel_termios_to_user_termios(arg, &kterm)) ret = -EFAULT; return ret; #else case TCGETS: copy_termios(real_tty, &kterm); - if (kernel_termios_to_user_termios_1((struct termios __user *)arg, &kterm)) + if (kernel_termios_to_user_termios_1(arg, &kterm)) ret = -EFAULT; return ret; case TCGETS2: copy_termios(real_tty, &kterm); - if (kernel_termios_to_user_termios((struct termios2 __user *)arg, &kterm)) + if (kernel_termios_to_user_termios(arg, &kterm)) ret = -EFAULT; return ret; case TCSETSF2: - return set_termios(real_tty, p, TERMIOS_FLUSH | TERMIOS_WAIT); + return set_termios(real_tty, arg, TERMIOS_FLUSH | TERMIOS_WAIT); case TCSETSW2: - return set_termios(real_tty, p, TERMIOS_WAIT); + return set_termios(real_tty, arg, TERMIOS_WAIT); case TCSETS2: - return set_termios(real_tty, p, 0); + return set_termios(real_tty, arg, 0); #endif case TCGETA: - return get_termio(real_tty, p); + return get_termio(real_tty, arg); case TCSETAF: - return set_termios(real_tty, p, TERMIOS_FLUSH | TERMIOS_WAIT | TERMIOS_TERMIO); + return set_termios(real_tty, arg, TERMIOS_FLUSH | TERMIOS_WAIT | TERMIOS_TERMIO); case TCSETAW: - return set_termios(real_tty, p, TERMIOS_WAIT | TERMIOS_TERMIO); + return set_termios(real_tty, arg, TERMIOS_WAIT | TERMIOS_TERMIO); case TCSETA: - return set_termios(real_tty, p, TERMIOS_TERMIO); + return set_termios(real_tty, arg, TERMIOS_TERMIO); #ifndef TCGETS2 case TIOCGLCKTRMIOS: copy_termios_locked(real_tty, &kterm); - if (kernel_termios_to_user_termios((struct termios __user *)arg, &kterm)) + if (kernel_termios_to_user_termios(arg, &kterm)) ret = -EFAULT; return ret; case TIOCSLCKTRMIOS: if (!capable(CAP_SYS_ADMIN)) return -EPERM; copy_termios_locked(real_tty, &kterm); - if (user_termios_to_kernel_termios(&kterm, - (struct termios __user *) arg)) + if (user_termios_to_kernel_termios(&kterm, arg)) return -EFAULT; down_write(&real_tty->termios_rwsem); real_tty->termios_locked = kterm; @@ -851,15 +849,14 @@ int tty_mode_ioctl(struct tty_struct *tty, unsigned int cmd, unsigned long arg) #else case TIOCGLCKTRMIOS: copy_termios_locked(real_tty, &kterm); - if (kernel_termios_to_user_termios_1((struct termios __user *)arg, &kterm)) + if (kernel_termios_to_user_termios_1(arg, &kterm)) ret = -EFAULT; return ret; case TIOCSLCKTRMIOS: if (!capable(CAP_SYS_ADMIN)) return -EPERM; copy_termios_locked(real_tty, &kterm); - if (user_termios_to_kernel_termios_1(&kterm, - (struct termios __user *) arg)) + if (user_termios_to_kernel_termios_1(&kterm, arg)) return -EFAULT; down_write(&real_tty->termios_rwsem); real_tty->termios_locked = kterm; @@ -977,7 +974,7 @@ int n_tty_ioctl_helper(struct tty_struct *tty, unsigned int cmd, return __tty_perform_flush(tty, arg); default: /* Try the mode commands */ - return tty_mode_ioctl(tty, cmd, arg); + return tty_mode_ioctl(tty, cmd, (void __user *)arg); } } EXPORT_SYMBOL(n_tty_ioctl_helper); diff --git a/include/linux/tty.h b/include/linux/tty.h index ae41893f8653f..cb1d452d88e5e 100644 --- a/include/linux/tty.h +++ b/include/linux/tty.h @@ -464,7 +464,7 @@ int tty_set_termios(struct tty_struct *tty, struct ktermios *kt); void tty_wakeup(struct tty_struct *tty); -int tty_mode_ioctl(struct tty_struct *tty, unsigned int cmd, unsigned long arg); +int tty_mode_ioctl(struct tty_struct *tty, unsigned int cmd, void __user *arg); int tty_perform_flush(struct tty_struct *tty, unsigned long arg); struct tty_struct *tty_init_dev(struct tty_driver *driver, int idx); void tty_release_struct(struct tty_struct *tty, int idx);