| From 0eabed6f652c5e5cdf8d4372fe7407febc58c567 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Thu, 3 Dec 2020 03:03:31 +0100 |
| Subject: tty: Remove dead termiox code |
| |
| From: Jann Horn <jannh@google.com> |
| |
| [ Upstream commit e0efb3168d34dc8c8c72718672b8902e40efff8f ] |
| |
| set_termiox() and the TCGETX handler bail out with -EINVAL immediately |
| if ->termiox is NULL, but there are no code paths that can set |
| ->termiox to a non-NULL pointer; and no such code paths seem to have |
| existed since the termiox mechanism was introduced back in |
| commit 1d65b4a088de ("tty: Add termiox") in v2.6.28. |
| Similarly, no driver actually implements .set_termiox; and it looks like |
| no driver ever has. |
| |
| Delete this dead code; but leave the definition of struct termiox in the |
| UAPI headers intact. |
| |
| Signed-off-by: Jann Horn <jannh@google.com> |
| Link: https://lore.kernel.org/r/20201203020331.2394754-1-jannh@google.com |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/tty/tty_ioctl.c | 61 ++------------------------------------ |
| include/linux/tty.h | 1 - |
| include/linux/tty_driver.h | 9 ------ |
| 3 files changed, 2 insertions(+), 69 deletions(-) |
| |
| diff --git a/drivers/tty/tty_ioctl.c b/drivers/tty/tty_ioctl.c |
| index e18f318586ab..4de1c6ddb8ff 100644 |
| --- a/drivers/tty/tty_ioctl.c |
| +++ b/drivers/tty/tty_ioctl.c |
| @@ -443,51 +443,6 @@ static int get_termio(struct tty_struct *tty, struct termio __user *termio) |
| return 0; |
| } |
| |
| - |
| -#ifdef TCGETX |
| - |
| -/** |
| - * set_termiox - set termiox fields if possible |
| - * @tty: terminal |
| - * @arg: termiox structure from user |
| - * @opt: option flags for ioctl type |
| - * |
| - * Implement the device calling points for the SYS5 termiox ioctl |
| - * interface in Linux |
| - */ |
| - |
| -static int set_termiox(struct tty_struct *tty, void __user *arg, int opt) |
| -{ |
| - struct termiox tnew; |
| - struct tty_ldisc *ld; |
| - |
| - if (tty->termiox == NULL) |
| - return -EINVAL; |
| - if (copy_from_user(&tnew, arg, sizeof(struct termiox))) |
| - return -EFAULT; |
| - |
| - ld = tty_ldisc_ref(tty); |
| - if (ld != NULL) { |
| - if ((opt & TERMIOS_FLUSH) && ld->ops->flush_buffer) |
| - ld->ops->flush_buffer(tty); |
| - tty_ldisc_deref(ld); |
| - } |
| - if (opt & TERMIOS_WAIT) { |
| - tty_wait_until_sent(tty, 0); |
| - if (signal_pending(current)) |
| - return -ERESTARTSYS; |
| - } |
| - |
| - down_write(&tty->termios_rwsem); |
| - if (tty->ops->set_termiox) |
| - tty->ops->set_termiox(tty, &tnew); |
| - up_write(&tty->termios_rwsem); |
| - return 0; |
| -} |
| - |
| -#endif |
| - |
| - |
| #ifdef TIOCGETP |
| /* |
| * These are deprecated, but there is limited support.. |
| @@ -815,23 +770,11 @@ int tty_mode_ioctl(struct tty_struct *tty, struct file *file, |
| return ret; |
| #endif |
| #ifdef TCGETX |
| - case TCGETX: { |
| - struct termiox ktermx; |
| - if (real_tty->termiox == NULL) |
| - return -EINVAL; |
| - down_read(&real_tty->termios_rwsem); |
| - memcpy(&ktermx, real_tty->termiox, sizeof(struct termiox)); |
| - up_read(&real_tty->termios_rwsem); |
| - if (copy_to_user(p, &ktermx, sizeof(struct termiox))) |
| - ret = -EFAULT; |
| - return ret; |
| - } |
| + case TCGETX: |
| case TCSETX: |
| - return set_termiox(real_tty, p, 0); |
| case TCSETXW: |
| - return set_termiox(real_tty, p, TERMIOS_WAIT); |
| case TCSETXF: |
| - return set_termiox(real_tty, p, TERMIOS_FLUSH); |
| + return -EINVAL; |
| #endif |
| case TIOCGSOFTCAR: |
| copy_termios(real_tty, &kterm); |
| diff --git a/include/linux/tty.h b/include/linux/tty.h |
| index bc8caac390fc..5972f43b9d5a 100644 |
| --- a/include/linux/tty.h |
| +++ b/include/linux/tty.h |
| @@ -303,7 +303,6 @@ struct tty_struct { |
| spinlock_t flow_lock; |
| /* Termios values are protected by the termios rwsem */ |
| struct ktermios termios, termios_locked; |
| - struct termiox *termiox; /* May be NULL for unsupported */ |
| char name[64]; |
| struct pid *pgrp; /* Protected by ctrl lock */ |
| /* |
| diff --git a/include/linux/tty_driver.h b/include/linux/tty_driver.h |
| index 7186d77f431e..2f719b471d52 100644 |
| --- a/include/linux/tty_driver.h |
| +++ b/include/linux/tty_driver.h |
| @@ -224,14 +224,6 @@ |
| * line). See tty_do_resize() if you need to wrap the standard method |
| * in your own logic - the usual case. |
| * |
| - * void (*set_termiox)(struct tty_struct *tty, struct termiox *new); |
| - * |
| - * Called when the device receives a termiox based ioctl. Passes down |
| - * the requested data from user space. This method will not be invoked |
| - * unless the tty also has a valid tty->termiox pointer. |
| - * |
| - * Optional: Called under the termios lock |
| - * |
| * int (*get_icount)(struct tty_struct *tty, struct serial_icounter *icount); |
| * |
| * Called when the device receives a TIOCGICOUNT ioctl. Passed a kernel |
| @@ -285,7 +277,6 @@ struct tty_operations { |
| int (*tiocmset)(struct tty_struct *tty, |
| unsigned int set, unsigned int clear); |
| int (*resize)(struct tty_struct *tty, struct winsize *ws); |
| - int (*set_termiox)(struct tty_struct *tty, struct termiox *tnew); |
| int (*get_icount)(struct tty_struct *tty, |
| struct serial_icounter_struct *icount); |
| int (*get_serial)(struct tty_struct *tty, struct serial_struct *p); |
| -- |
| 2.30.2 |
| |